【发布时间】:2019-03-27 14:10:16
【问题描述】:
Django password_reset 表单不检查电子邮件是否存在。还验证表单提供的任何电子邮件地址。
问题是,我如何使用自定义表单检查不存在的电子邮件并抛出错误?
顺便说一句,我在here 找到了以下解决方案,但它对我不起作用。 (使用 Django 2.1)。如果这应该工作,我找不到我缺少的东西。
forms.py
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
path('sifre-sifirla/', PasswordResetView.as_view(), {'password_reset_form':EmailValidationOnForgotPassword}, name='password_reset'),
提前谢谢你。
编辑:
对于其他用户的信息,问题由@Alasdair 回答并工作,但@pypypy 的观点也很重要。
urls.py的变化如下:
path('sifre-sifirla/', PasswordResetView.as_view(form_class=EmailValidationOnForgotPassword), name='password_reset'),
【问题讨论】:
-
一般来说,您不希望在电子邮件不存在的情况下显示错误,因为这可以用作用户枚举安全漏洞。
-
是的,你是对的!因此,在 password_reset_done.html 上添加一些信息,例如“如果您没有收到电子邮件,您将输入另一个电子邮件地址”将解决问题。顺便说一句,我想知道将来使用的解决方案。不管怎样,谢谢你。 @pypypy
-
对于
PasswordResetView,属性是form_class,而不是password_reset_form。我会删除字典并将其作为参数传递给as_view():path('sifre-sifirla/', PasswordResetView.as_view(form_class=EmailValidationOnForgotPassword), name='password_reset'),。 -
@Alasdair ,感谢您的回复,现在正在运行。但 pypypy 的观点对我来说也很重要。现在我知道该怎么做。再次感谢。
-
是的,您要考虑是否可以接受透露帐户存在。但请记住,您可能已经在其他地方公开了它。例如,您的注册页面可能会显示错误“使用该电子邮件的帐户已存在”。
标签: django validation email