Skip to content

Rendering Forms in Templates

You can render forms manually (recommended for control) or use quick rendering.

Template example:

<form method="post">
  {{ form.hidden_tag() }}
 
  <div>
    {{ form.name.label }}
    {{ form.name() }}
    {% for error in form.name.errors %}
      <p class="error">{{ error }}</p>
    {% endfor %}
  </div>
 
  <div>
    {{ form.email.label }}
    {{ form.email() }}
    {% for error in form.email.errors %}
      <p class="error">{{ error }}</p>
    {% endfor %}
  </div>
 
  {{ form.submit() }}
</form>
<form method="post">
  {{ form.hidden_tag() }}
 
  <div>
    {{ form.name.label }}
    {{ form.name() }}
    {% for error in form.name.errors %}
      <p class="error">{{ error }}</p>
    {% endfor %}
  </div>
 
  <div>
    {{ form.email.label }}
    {{ form.email() }}
    {% for error in form.email.errors %}
      <p class="error">{{ error }}</p>
    {% endfor %}
  </div>
 
  {{ form.submit() }}
</form>

Adding HTML attributes

{{ form.name(class_="input", placeholder="Your name") }}
{{ form.name(class_="input", placeholder="Your name") }}

Note: use class_class_ (underscore) because classclass is a Python keyword.

Keeping templates clean

As forms grow, you can move repeated field rendering into a partial:

  • templates/partials/_field.htmltemplates/partials/_field.html

Then include it for each field.

If this helped you, consider buying me a coffee ☕

Buy me a coffee

Was this page helpful?

Let us know how we did