2010-03-12 95 views
6

當覆蓋表單清理方法時,您如何知道其任何字段的驗證失敗?例如在下面的表格中,如果我覆蓋了乾淨的方法,我如何知道表單在任何字段上的驗證是否失敗?django覆蓋表單清理方法

class PersonForm(forms.Form): 
    title = Forms.CharField(max_length=100) 
    first_name = Forms.CharField(max_length=100) 
    surname = Forms.CharField(max_length=100) 
    password = Forms.CharField(max_length=100) 

def clean(self, value): 
    cleaned_data = self.cleaned_data 

    IF THE FORM HAS FAILED VALIDATION: 
     self.data['password'] = 'abc' 
     raise forms.ValidationError("You have failed validation!") 
    ELSE: 
     return cleaned_data 

感謝

回答

10

您可以檢查是否有任何錯誤已添加到錯誤字典:

def clean(self, value): 
    cleaned_data = self.cleaned_data 

    if self._errors: 
     self.data['password'] = 'abc' 
     raise forms.ValidationError("You have failed validation!") 
    else: 
     return cleaned_data 

獎勵!您可以檢查是否存在錯誤的具體領域:

def clean(self, value): 
    cleaned_data = self.cleaned_data 

    if self._errors and 'title' in self._errors: 
     raise forms.ValidationError("You call that a title?!") 
    else: 
     return cleaned_data 
+1

嗨標記我正在使用此過程,但驗證錯誤顯示在管理(change_form)頁上,我如何顯示錯誤消息就在我正在應用驗證的字段上方。在此先感謝 – 2012-03-31 11:59:26

+1

最簡單的方法是在您的字段的'clean_ '內提高驗證錯誤。請參閱https://docs.djangoproject.com/en/1。4/ref/forms/validation/ – 2012-03-31 12:33:55

+1

嗨,Mark我已經寫了這個raise forms.ValidationError({'interview_type':[「error message」,]}),但它顯示了change_form上的錯誤信息。我該怎麼修改。 – 2012-03-31 12:44:54

4

如果你的數據不驗證,您 表格實例將不會有一個 cleaned_data屬性

Django Doc on Accessing "clean" data

使用self.is_valid()

+0

所以,我會只是做cleaned_data 例如支票 如果不是self.cleaned_data: #做些什麼 – John 2010-03-12 13:41:08

+0

不,該屬性不存在,你會得到一個AttributeError。我延長了我的回答。 – stefanw 2010-03-12 15:17:46

0

這裏是django.forms.Form覆蓋clean(),也爲AnonymousRequiredMixin使用django-braces的一個簡單的例子來要求只有匿名用戶訪問盧萬頁:

class LoginView(AnonymousRequiredMixin, FormView): 
    """ 
    Main Login. And Social Logins 
    """ 
    template_name = 'core/login.html' 
    form_class = LoginForm 
    success_url = reverse_lazy('blog:index') 

    def get_success_url(self): 
     try: 
      next = self.request.GET['next'] 
     except KeyError: 
      next = self.success_url 
     return next 

    def form_valid(self, form): 
     cd = form.cleaned_data 
     user = auth.authenticate(username=cd['login_username'], 
      password=cd['login_password']) 
     if user: 
      auth.login(self.request, user) 
      messages.info(self.request, 'You are logged in.') 
     return super(LoginView, self).form_valid(form) 
0

雖然它的舊帖子,如果你想申請驗證超過1場相同的表格/模型使用clean()。此方法返回已清理數據字典。

要向用戶顯示錯誤,您可以使用add_error(<fieldname>, "your message")方法。這將顯示錯誤以及字段名稱,而不是表單頂部。示例如下所示:

add_error()自動從字段中刪除字段清空數據字典,您不必手動刪除它。你也不需要導入任何東西來使用它。

documentation is here

def clean(self): 

    if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
    msg = 'passwords do not match' 
    self.add_error('password2', msg) 

    return self.cleaned_data 

如果你只是想在表格/使用的ModelForm的clean_<fieldname>()單場驗證。此方法將採用cleared_data字典中的值,然後您可以檢查邏輯錯誤。檢查完邏輯後,總是返回值。

def clean_password(self): 

    password = self.cleaned_data['password'] 

    if len(password)<6: 
    msg = 'password is too short' 
    self.add_error('password', msg) 

    return password