2017-08-02 15 views
1

組み込みDjangoフォーム(django.contrib.auth.SetPasswordForm)のクリーンメソッドをオーバーライドする際に問題があります。このフォームには、new_password1とnew_password2という2つのフィールドがあります。私forms.pyでフォームのクリーンメソッドをオーバーライドしてエラーメッセージをカスタマイズする

def reset_confirm(request, uidb64=None, token=None): 
    return password_reset_confirm_delegate(request, 
     template_name='app/reset_confirm.html', 
     set_password_form = MySetPasswordForm, uidb64=uidb64, 
     token=token, post_reset_redirect=reverse('main_page')) 

ので、私のviews.pyに私は、カスタマイズされたフォーム(MySetPasswordForm)を呼び出して、私は私のカスタマイズされたエラーメッセージを表示するために私自身のきれいなメソッドを定義したいです。ここで私はMySetPasswordFormを書いた方法は次のとおりです。

from django.contrib.auth.forms import SetPasswordForm 
class MySetPasswordForm(SetPasswordForm): 
    error_messages = { 'password_mismatch': _("Missmatch!"), } 

    def clean(self): 
     password1 = self.cleaned_data.get('new_password1', '') 
     password2 = self.cleaned_data.get('new_password2', '') 

     print password1 #prints user's entered value 
     print password2 #prints nothing!! 
     print self.data['new_password2'] #prints user's entered value 

     if password1 == '': 
      self._errors["new_password1"] = ErrorList([u"enter pass1!"]) 

     if password2 == '': 
      self._errors["new_password2"] = ErrorList([u"enter pass2"]) 

     elif password1 != password2: 
      raise forms.ValidationError(
        self.error_messages['password_mismatch'], 
        code='password_mismatch', 
       ) 
     return self.cleaned_data 

問題は、ユーザーが代わりに"Missmatch" errorを得るための間違った繰り返しパスワードを入力したときに、それは"enter pass2"を与えるということです!また、print password2は、password2に入力されたユーザーの値を表示しません。

このコードで何が間違っていますか?カスタマイズされたエラーメッセージを作成する最善の方法は何ですか?

p.s.ビュー内の元のSetPasswordFormを使用するとうまく動作します。

答えて

2

SetPasswordFormclean_new_password2の方法でnew_password1new_password2が一致することを確認します。

パスワードが一致しない場合、new_password2self.cleaned_dataに含まれていないため、cleanメソッドでアクセスできません。

一致しないパスワードのエラーメッセージを上書きする場合は、error_messages dictに設定することが適切です。私はあなたのフォームからcleanメソッドを削除します。

フィールドごとに異なるrequiredエラーメッセージが必要な場合は、__init__メソッドで設定できます。

class MySetPasswordForm(SetPasswordForm): 
    error_messages = { 
     'password_mismatch': _("Missmatch!"), 
     'required': _("Please enter a password"), # If you do not require the fieldname in the error message 
    } 

    def __init__(self, *args, **kwargs): 
     super(MySetPasswordForm, self).__init__(*args, **kwargs) 
     self.fields['new_password1'].error_messages['required'] = _("enter pass1!") 
+0

感謝を見て、自分のフォームでclean_new_password2をオーバーライドする必要がありますどうすれば 'error_messages'ディクテーションを設定できますか? –

+0

あなたはすでにあなたの質問に 'error_messages'を置いています。私は例を追加しました。 – Alasdair

+0

awesome tnx。私はまだフォームを使用してnewbyだと思います:) また私のフィールドでmin-lengthバリデーションが必要です、私はerror_messagesを使ってこのバリデーションを行うことができますか(もしそうなら?)か、クリーンメソッドを使わなければなりませんか? –

1

あなたはすべての準備が呼ばれたフォームスーパー方法def clean_new_password2(self)のきれいなメソッドを呼び出すと、そのself.cleaned_data['new_password2']が空であるあなたは、ソースのために答えをauth forms

class MySetPasswordForm(SetPasswordForm): 

    def clean_new_password2(self): 
     password1 = self.cleaned_data.get('new_password1') 
     password2 = self.cleaned_data.get('new_password2') 
     if password1 and password2: 
      if password1 != password2: 
       raise forms.ValidationError(
        self.error_messages['password_mismatch'], 
        code='password_mismatch', 
       ) 
     return password2 
+0

答えをいただきありがとうございます。どうすれば 'clean_new_password2'をオーバーライドでき、他のバリデーションもできますか? –

+0

元のコードを追加しました –

+0

他のフィールドの検証はどうですか?私は彼らのために別の清潔な方法が必要ですか? –

関連する問題