是否有更好的,更“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>
{{ 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 form []”块中的错误,但如果我想从每个错误的开头剥离HTML标记,它们似乎是必需的。另请注意,我没有通过将每个“for”循环放在“if form ['field']。errors”块中来检查错误,因为省略这一点并没有什么区别,我希望这段代码能够像可能。
有更好的方法吗?谢谢!
答案 0 :(得分:0)
你可以这样做。你正在使用相同的想法(两个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 %}
按您的意愿格式化,但我认为这样可以给你一个想法。您还可以自定义表单中的错误消息:
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')
....