2011-01-02 5 views
1

ユーザー登録ページの簡単な例を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 
       }) 
+0

class MyFormClass(ModelForm): class Meta: exclude = ('type_detail') #wrong 

代わりに:私のフォームメタにおけるタプルとして除外設定あなたのきれいな方法を呼び出す必要があります。正しい 'RegistrationForm'をインポートしたことを確信していますか?検証メソッドがないと別のバージョンがあるかもしれませんか? –

+0

'clean_fieldname'メソッドは特定の順序で呼び出されないので、' clean_password2'はすでに 'cleaned_data'にある' password1'に依存できません。 'password2'が' password1'より前に処理されると 'ValidationError'がスローされる可能性があります。 –

+0

それは間違いなくclean_username()をスキップしています。 –

答えて

0

これは本当に不思議でした。私はforms.pyの自動保存版を復元し、魔法のように動作するようになりましたが、上記のコードスニペットと復元されたファイルを区別できる違いはありません。

短い答え:「プログラマのエラー」

3

他のケース誰にグーグルを経て、ここで取得し、上記の答えは助けにはならない:

私はこの同じ問題を抱えていたし、それは私ではなかったことが判明この私

class MyFormClass(ModelForm): 
    class Meta: 
     exclude = ('type_detail',) #right 
+0

どういう意味ですか?どこに除外しますか?それは元々の問題ではなかった。 –

+0

メタの形で、私は自分の答えを更新しました。 –

関連する問題