Domyślna struk­tura gene­ro­wana przez metodę django.forms.Form.as_table pozo­sta­wia nieco do życze­nia. Stąd nieco wygod­niej­sza i nie­in­wa­zyjna wer­sja w postaci fil­tra (zasta­na­wiam się, czemu ta wbu­do­wana w Django ma postać metody):

from django.template.loader import render_to_string

@register.filter
def as_table(form):
    return render_to_string('form_as_table.html', {'form': form})

Do kom­pletu przy­kła­dowy szablon:

{% for f in form %}
{% if f.errors %}
    <tr class="{{ f.name }} errors">
        <td colspan="2">
            <div class="error">{{ f.errors }}</div>
        </td>
    </tr>
{% endif %}
    <tr class="{{ f.name }} {% if f.errors %}errors{% endif %}">
        <th>{{ f.label_tag }}:</th>
        <td>
{% if f.help_text %}
            <span>{{ f.help_text }}</span>
{% endif %}
            {{ f }}
        </td>
    </tr>
{% endfor %}