Domyślna struktura generowana przez metodę django.forms.Form.as_table pozostawia nieco do życzenia. Stąd nieco wygodniejsza i nieinwazyjna wersja w postaci filtra (zastanawiam się, czemu ta wbudowana 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 kompletu przykładowy szablon: