ユーザー登録ページの簡単な例をDjango 1.0 Web Site Developmentにコピーしました。ユーザー名は既に、フィールドは通常のフォーム検証を使用して検証されて取られて、私のカスタムクリーンなメソッドが呼び出されていない場合にはDjango form.is_valid()メソッドを呼び出さないclean_ <fieldname>
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):
if 'password1' in self.cleaned_data:
password1 = self.cleaned_data['password1']
password2 = self.cleaned_data['password2']
if password1 == password2:
return password2
raise forms.ValidationError('Passwords do not match.')
def clean_username(self):
print "Validating username..."
username = self.cleaned_data['username']
if not re.search(r'^\w+', username):
raise forms.ValidationError('Username can only contain '
'alphanumeric characters and the underscore.')
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError('Username is already taken')
:私は次の形式を定義しています。フォームがregister_pageに送信されると、form.is_valid()はTrueを返します。
Djangoがclean_メソッドを呼び出すのを知るために必要なものがありますか?
def register_page(request):
if request.method == 'POST':
print "Posted to registration form"
form = RegistrationForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data['username'],
password=form.cleaned_data['password1'],
email=form.cleaned_data['email']
)
return HttpResponseRedirect('/')
else:
form = RegistrationForm()
return render_to_response(
'users/registration.html',
context_instance=RequestContext(request, {
'form' : form
})
:
代わりに:私のフォームメタにおけるタプルとして除外設定あなたのきれいな方法を呼び出す必要があります。正しい 'RegistrationForm'をインポートしたことを確信していますか?検証メソッドがないと別のバージョンがあるかもしれませんか? –
'clean_fieldname'メソッドは特定の順序で呼び出されないので、' clean_password2'はすでに 'cleaned_data'にある' password1'に依存できません。 'password2'が' password1'より前に処理されると 'ValidationError'がスローされる可能性があります。 –
それは間違いなくclean_username()をスキップしています。 –