2012-06-20 48 views
0

我利用了這些內置的Django表單,並且遇到了一個小問題。如何爲內置表單自定義Django表單驗證錯誤?

  • 類AdminPasswordChangeForm
  • 類AuthenticationForm
  • 類PasswordChangeForm
  • 類PasswordResetForm
  • 類SetPasswordForm
  • 類UserChangeForm
  • 類UserCreationForm

例如,UserCreationForm會生成幾個驗證錯誤,我可以使用標記(例如{{ form.errors }})或者甚至與特定字段相關的標記(如{{ form.username.errors }})在我的模板中顯示這些錯誤。

我知道如何自定義這些錯誤消息的樣式,但我如何定製文本?我已經能夠簡單地檢查一個條件語句是否存在錯誤,如{% if form.password.errors %},並將我自己的自定義文本放在該塊中。然而,這讓我對所引發的錯誤類型視而不見。

例如,我希望能夠識別觸發的錯誤是duplicate_username還是password_mismatch,因此我可以在模板中編寫自己的錯誤。

任何幫助,將不勝感激!

回答

2

一般來說,你可以自定義像下面的清潔方法:

class EventDetailsForm(form.ModelForm): 
    class Meta: 
     model = Event 
     fields = ('name',) 
     layout = (
       Fieldset('', 
       'name',), 
       ) 

    def clean_name(self): 
     event_name = self.cleaned_data['name'] 
     if Event.objects.filter(name=event_name, status='Live').\ 
       exclude(id=self.instance.id).exists(): 
      raise forms.ValidationError('This Name is already in use') 
     else: 
      return event_name 

因此重新使用Django的形式,只是它的子類,添加額外的驗證邏輯和調用的形式在您的視圖功能。

+1

這是一個額外的檢查?或者,在原始形式的子類中添加乾淨的方法是否覆蓋/替換現有的清潔方法? –

+1

它會覆蓋它。所以你可以複製現有的驗證方法並添加你自己的定製邏輯。不是超級幹,但完成了工作。 – super9

+0

不知道我是否誤解了一些東西,但我只是嘗試創建'UserCreationForm'和'AuthenticationForm'的子類,並且原始邏輯仍然完全存在。它只會改變,如果我創建具有相同名稱的函數來替換原來的函數。 –