【问题标题】:Django output form errors as table rows in {{ form.as_table }}Django 将表单错误输出为 {{ form.as_table }} 中的表行
【发布时间】:2011-08-06 15:55:47
【问题描述】:

我真的发现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>

但我想知道的是,是否有更简单的方法可以做到这一点?也许我在文档中错过了什么?或者也许你们采用了不同的方法?

【问题讨论】:

    标签: django django-templates django-forms


    【解决方案1】:

    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>
    

    模板.html:

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

    多种形式也可以,例如查看包含 form1 和 form2 的上下文:

    模板.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 }} 时更改呈现方式

    【讨论】:

    • 不错,我喜欢模板的想法。
    • 虽然,我有一个关于自定义错误列表类的问题。我可以在我的表单类定义本身中将我的自定义列表设置为默认值吗?还是我别无选择,只能在我使用表单的每个视图中将其放入构造函数中?
    • 您可能想查看source。 error_class 是从 BaseForm 继承的 Form 的一个属性。您可以在编写表单时覆盖错误类。你也可以重写 as_table 方法。
    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2013-05-01
    • 2021-10-20
    相关资源
    最近更新 更多