2011-05-03 106 views
2

我是Django和python的新手,正在努力从书中学习它。在下面的代码中,我试图确保password1和password2是相同的,但它似乎不运行clean_password2验证,因为即使它们具有不同的值,它始终返回true。Django form.is_valid总是返回true

import re 
from django.contrib.auth.models import User 
from django import forms 

class RegistrationForm(forms.Form): 
    username = forms.CharField(label=u'Username', max_length=30) 
    email = forms.EmailField(label=u'Email') 
    password1 = forms.CharField(
     label= u'Password', 
     widget = forms.PasswordInput() 
    ) 
    password2 = forms.CharField(
     label= u'Password (Again)', 
     widget = forms.PasswordInput() 
    ) 

    def clean_password2(self): 
     password1 = self.cleaned_data.get('password1') 
     password2 = self.cleaned_data.get('password2') 

     if password1 != password2: 
      raise forms.ValidationError('Passwords do not match.') 
     return password2 
+0

要在多个字段(正是这种用例)上执行验证,您应该重写Form的'clean()'方法。例如,请参阅http://docs.djangoproject.com/en/1.3/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other。 – dcrosta 2011-05-03 21:39:51

回答

1

需要访问多个字段的验证程序应该是clean()方法的一部分,而不是clean_<filedname>()方法的一部分。看看django-registration如何做你要找的:https://bitbucket.org/ubernostrum/django-registration/src/58eef8330b0f/registration/forms.py#cl-57

+0

谢谢你。这个示例代码真的有帮助,因为我的代码格式也没有正确缩进,并且该功能甚至没有被识别。我是一个真正的Python noob。 – cade 2011-05-04 12:10:21

+1

我甚至没有想到这可能是一个问题(当我编辑你的问题代码格式)。 空格在Python中很重要,请务必牢记这一点,它表示您的块级别。 – 2011-05-04 18:11:21

3

如果你正在清理是互相依赖的两个领域,你应该重写形式的clean()方法。你可以阅读更多here

0

你确定你在检查form.is_valid()而不是form.is_valid?这是一种方法,而不是一种财产。