2011-05-03 111 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?這是一種方法,而不是一種財產。