Chapter 18: Building Forms and Reusable UI Helpers
ASP.NET Core Tag Helpers reduce repetitive form markup. In Python/Jinja2, use macros, partial templates, or a form library.
Jinja2 macro:
{% macro field(name, label, value="", errors=[]) %}
<label for="{{ name }}">{{ label }}</label>
<input id="{{ name }}" name="{{ name }}" value="{{ value|e }}">
{% if errors %}
<p class="error">{{ errors[0] }}</p>
{% endif %}
{% endmacro %}
Use it:
{% from "forms.html" import field %}
{{ field("title", "Title", form.title, errors.title) }}
Good helper design:
- Keep helpers visual, not business-aware.
- Let handlers decide data and validation.
- Prefer a small set of project macros over a large custom template framework.
- For complex form-heavy apps, evaluate Django forms before building your own mini-framework.