2013-08-26 65 views
1

有沒有更好的,更「Django-istic」的方式來把Django表單錯誤消息按照特定的順序比下面顯示的技術?我有一個有十個領域的表格。如果用戶沒有填寫必填字段,或者他們輸入了無效數據,我通過在自定義錯誤列表中顯示紅色「x」和錯誤消息來遍歷表單的錯誤字段下面的頂部和一個紅色的「X」旁邊的無效字段(S):更好的方式來重新排序Django表單錯誤?

{# 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屬性。我不喜歡「在form []」塊中出現錯誤,但是如果我想從每個錯誤的開頭去掉HTML標籤,它們似乎是必需的。另外請注意,我並沒有通過將每個「for」循環放在「if form ['field']。errors」塊中來檢查錯誤,因爲忽略這一點並沒有什麼區別,我希望這段代碼的運行速度儘可能快可能。

有沒有更好的方法來做到這一點?謝謝!

+0

爲什麼不把它顯示在每個元素旁邊? –

+0

因爲這將成爲「移動第一」網站。我正在設計它主要在手機上觀看,而典型的電話屏幕不夠寬。我可以將錯誤放在表單域下面,但用戶必須一直向下滾動頁面以查看是否有任何錯誤。我更喜歡所有的錯誤在頂端。 – William

+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') 
    .... 

更多關於form field validation from Django docs

相關問題