2011-03-14 76 views
1

我在網上花了很多年,如何覆蓋django中的change_password表單。我創建了我的表單,並且可以成功更改我的密碼。現在我想在頁面上顯示我的錯誤。 (順便說一下,我正在使用django註冊。)如何覆蓋django中的password_change錯誤消息?

問題是我必須更改錯誤消息。在我的模板,我用這個功能來顯示new_password1錯誤:

{% if form.new_password1.errors %} 
    <div class="error_message"> blah </div> 
{% endif %} 

然而,它由所有new_password1 errrors的。我查看了文檔,發現CharField只有最大值和最小值。我需要檢查new_password1(確認錯誤,所需錯誤和最小,最大)的每個特定錯誤並生成我自己的錯誤消息。由於CharField沒有匹配的關鍵詞,我想在我的forms.py乾淨的方法,該方法是這樣的:

def clean_password2(self):                                                        
     if 'new_password1' in self.cleaned_data and 'new_password2' in self.cleaned_data:                                         
      if self.cleaned_data['new_password1'] != self.cleaned_data['new_password2']:                                          
       raise forms.ValidationError(_(u"no match"))                                                 

     return cleaned_data 

最後,我不知道如何在我的模板檢查這clean_password2驗證。當我編寫註冊頁面時,我可以通過循環顯示所有錯誤。它顯示所有被忽略的錯誤。這次它不起作用。所以我的問題是:

1-我如何檢查我的模板中的所有特定錯誤?如果form.new_password1.required.errors

2-我怎樣才能顯示這個clean_password2消息?

回答

2

在django說,你指的是視圖是模板。這很混亂!

更新:我看到您定義了clean_password2函數,但您正在檢查名爲new_password1,new_password2的字段。

除非您有一個名爲password2的域,是您的clean方法正在驗證的域。

clean_password2的消息在{{ form.password2.errors }}中生成,但對我而言,聽起來好像您沒有一個名爲password2的字段。

將您的方法的名稱更改爲clean_new_password2

{% if form.new_password1.errors %}{{ form.new_password1.errors }}{% endif %} 
{% if form.new_password2.errors %}{{ form.new_password2.errors }}{% endif %} 

表單字段清理工作每場..您訪問字段對象的錯誤。

+0

對不起,我不知道爲什麼我寫了意見,我改變了他們=) 我試過你的建議,但它沒有給出任何消息。我用new_password1替換了password1,它給出了這個字段是必需的。在這兩種情況下,password2都不給予任何迴應。 – iva123 2011-03-14 19:42:32

+0

啊,我明白了。不知何故,我錯過了你的代碼中的部分,我看到你有一個'clean_password2'定義,但你的字段被命名爲'new_password1'和2.更新我的帖子.. – 2011-03-14 23:21:48

0

贊@Yuji說,在您的模板中使用{% if form.non_field_errors %}

現在只是一點可用性。關於用戶註冊和密碼更改表單,您所期望的唯一非現場錯誤將是密碼不匹配,因此與其他表單不同,您將在最初打印非現場錯誤,對於這些表單,打印有意義在兩個密碼輸入字段之前的一個非字段錯誤,可能將它們包裝在具有紅色背景的父代中,以使兩個字段的值相關更明顯,並且錯誤涉及兩個字段,而不是一般形式。