2015-01-01 8 views
9

私は組み込みのdjangoパスワードリセット機能を使用しています。 州:Djangoのパスワードリセットを使用して電子メールが無効であることをユーザーに通知します

提供された電子メールアドレスがシステムに存在しない場合、このビューは電子メールを送信しませんが、エラーメッセージも表示されません。これにより、潜在的な攻撃者に情報が漏れるのを防止します。この場合にエラーメッセージを表示する場合は、PasswordResetFormをサブクラス化してpassword_reset_form引数を使用します。

私の場合、間違ったユーザー名を使用してリセットしようとするとエラーメッセージが表示されます。

私は何をする必要があるのか​​理解していますが、私はPasswordResetFormをサブクラス化するフォームに何を書くべきか分かりません。

PasswordResetFormのサブクラスにはどのようなフォームが含まれていますか?

ありがとうございます。

+0

ユーザー名フィールドのクリーンメソッドをオーバーライドするだけです。 – Brandon

答えて

10

私は最終的に自分自身を理解しました。ここに私の実装です:

class EmailValidationOnForgotPassword(PasswordResetForm): 
    def clean_email(self): 
     email = self.cleaned_data['email'] 
     if not User.objects.filter(email__iexact=email, is_active=True).exists(): 
      raise ValidationError("There is no user registered with the specified email address!") 

     return email 

あなたはまたurls.py{'password_reset_form': EmailValidationOnForgotPassword}を追加する必要があります。次に例を示します。

url(r'^user/password/reset/$', 
    'django.contrib.auth.views.password_reset', 
    {'post_reset_redirect': '/user/password/reset/done/', 
    'html_email_template_name': 'registration/password_reset_email.html', 
    'password_reset_form': EmailValidationOnForgotPassword}, 
    name="password_reset"), 
+2

おそらく、大文字と小文字を区別しない一致と、アクティブなユーザーのみが必要です。フォームが電子メールを送信しないときです。また、 'exists()'は 'get()'より少し速いので、User.objects.filter(email__iexact = email、is_active = True).exists():raise ValidationError' – knbk

+0

優れた観測、 ありがとうございました!私は答えを更新しました。 –

関連する問題