【问题标题】:Better way to re-order Django form errors?重新排序 Django 表单错误的更好方法?
【发布时间】:2013-08-29 04:02:28
【问题描述】:

有没有比下面显示的技术更好、更“Django-istic”的方法来按特定顺序放置 Django 表单错误消息?我有一个包含十个字段的表单。如果用户未填写必填字段或输入无效数据,我将通过显示红色“x”和错误消息来遍历表单的错误字段,这些字段已放入自定义错误列表中顶部和下面无效字段旁边的红色“x”:

{# template.html #}
<form method="post" action=".">
    {% csrf_token %}
    {# Non-field errors removed for clarity #}

    {# Iterate through error messages in custom ordered error list #}
    {% for error_message in ordered_error_list %}
        <img src='/static/img/red_x.png' alt='Error'></img>
        &nbsp;{{ error_message }}<br>
    {% endfor %}
    <br>

    {% for field in form.visible_fields %}
    <div>
        {{ field.label_tag }}<br />
        {{ field }}
        {% if field.errors %}
            <img src='/static/img/red_x.png' alt='Error'></img>
        {% endif %}
    </div>
    {% endfor %}

    {# Hidden fields removed for clarity #}
    <p><input type="submit" value="Continue" /></p>
</form>

这是我的视图和辅助函数:

# views.py
def create_member_profile(request):
    if request.method == "POST":
        form = CreateMemberProfileForm(request.POST)
        if form.is_valid():
            # Process form data and redirect to next page...
            return HttpResponseRedirect(reverse('review-member-profile'))
        # Before I re-POST the form and display the errors, I'll put the errors in order
        else:
            ordered_error_list = put_member_profile_errors_in_order(form)
    else:
        form = CreateMemberProfileForm()
    return render_to_response(template, locals(), context_instance=RequestContext(request))

def put_member_profile_errors_in_order(form):
    errors_in_order = []  # List
    for error in form['field_1'].errors:
        errors_in_order.append(error)
    for error in form['field_2'].errors:
        errors_in_order.append(error)
    for error in form['field_3'].errors:
        errors_in_order.append(error)
    # ...
    for error in form['field_10'].errors:
        errors_in_order.append(error)
    return errors_in_order

这一切看起来很有必要的原因是 form.errors 是一个字典,而 Python 字典,根据定义,是无序的。但是,正如我所说,我希望顶部的任何错误消息都以与它们引用的表单字段相同的顺序显示。我找不到任何允许我重新排序表单错误的 form.errors 属性。我不喜欢“for error in form[]”块,但如果我想从每个错误的开头剥离 HTML 标记,它们似乎是必需的。另请注意,我不是通过将每个“for”循环放在“if form['field'].errors”块中来检查错误,因为省略它并没有什么不同,我希望这段代码运行得尽可能快可能的。

有没有更好的方法来做到这一点?谢谢!

【问题讨论】:

  • 为什么不把它显示在每个元素旁边?
  • 因为这将是一个“移动优先”的网站。我将其设计为主要在手机上查看,而典型的手机屏幕不够宽。我可以将错误放在表单字段下方,但是用户必须一直向下滚动页面以查看是否有任何错误。我更喜欢将所有错误都放在顶部。
  • 或者您可以突出显示第一个引发错误的元素

标签: django django-forms django-views


【解决方案1】:

你可以做这样的事情。您正在使用相同的想法(两个 for 循环)。

<!-- near the top -->
<tr>
{% for field in form %}
    <td>{{ field.label_tag }}: {{ field.errors }}</td>
{% endfor %}
</tr>

<!-- your form -->
{% for field in form %}
<tr>
    <td>{{ field.label_tag }}:</td>
    <td>
        {{ field }}
        {{ field.help_text }}
    </td>
</tr>
{% endfor %}

按照您的意愿格式化,但我认为这会给您一个想法。您还可以自定义表单中的错误消息 clean:

from django import forms

YourForm(forms.Form):
    ....
    def field_clean(self):  # or use clean(self) for multiple fields
        ....
        raise forms.ValidationError(u'Your custom error')
    ....

更多关于form field validation from Django docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2012-06-14
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多