Django输出表格错误作为{{form.as_table}}中的表格行

时间:2011-04-15 21:49:12

标签: django django-templates django-forms

我确实发现as_table等表单输出快捷方式非常方便。但是,在使用这些方法时显示错误似乎与我有点违反直觉。当我使用as_table格式时,我希望根据表格格式显示我的字段特定错误。我可以像这样手动拼凑我的表单:

<table>
{% for error in form.non_field_errors %}
<tr><td>{{ error }}</td></tr>
{% endfor %}
{% endif %}

{% if form.username.errors %}
{% for error in form.username.errors %}
<tr><td>{{ error }}</td></tr>
{% endfor %}
{% endif %}
<tr><th><label for="id_username">Name:</label></th><td>{{ form.username }}</td></td>

{% if form.password.errors %}
{% for error in form.password.errors %}
<tr><td>{{ error }}</td></tr>
{% endfor %}
{% endif %}
<tr><th><label for="id_password">Password:</label>/th><td>{{ form.password }}</td></td>

但我想知道的是,如果有更简单的方法可以做到这一点?也许我在文档中遗漏了一些东西?或者你们中的任何一个人采用不同的方法?

1 个答案:

答案 0 :(得分:10)

How errors are displayedcustomizing the error list format显示默认错误字段输出以及如何自定义它。

我最近在我的项目中使用了reusable template,这对我来说效果很好。

table_form.html:

<table>
{% for error in form.non_field_errors %}
    <tr><td>{{ error }}</td></tr>
{% endfor %}

{% for field in form %}
    {% for error in form.username.errors %}
    <tr><td>{{ error }}</td></tr>
    {% endfor %}
    <tr><th>{{ field.label_tag }}:</th><td>{{ field }}</td></td>
{% endfor %}
</table>

template.html:

<form>
    {% include 'table_form.html' %}
</form>

多种形式也有效,例如包含form1和form2的上下文视图:

template.html:

<form>
    {% include 'table_form.html with form=form1 %}
</form>

<form>
    {% include 'table_form.html with form=form2 %}
</form>

修改

以下是BaseForm类中定义的as_table方法:

210     def as_table(self):
211         "Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
212         return self._html_output(
213             normal_row = u'<tr%(html_class_attr)s><th>%(label)s</th><td>%(errors)s%(field)s%(help_text)s</td></tr>',
214             error_row = u'<tr><td colspan="2">%s</td></tr>',
215             row_ender = u'</td></tr>',
216             help_text_html = u'<br /><span class="helptext">%s</span>',
217             errors_on_separate_row = False)

在表单中覆盖此方法将允许您在使用{{form.as_table}}

时更改渲染