【问题标题】:I can't displaying error messages on Django Authentication forms我无法在 Django 身份验证表单上显示错误消息
【发布时间】:2020-01-17 03:07:08
【问题描述】:

我在尝试在不同的身份验证表单上显示错误消息时遇到问题

  1. 在密码重置表单上:我想要实现的是显示 用户输入时出现“电子邮件不在我们的数据库中”之类的错误消息 未注册的电子邮件。
  2. 在密码设置表单上:我正在尝试显示“新密码和 确认密码不匹配”和任何其他有关的消息 表格

以下是我的代码

forms.py

from django.contrib.auth.forms import PasswordResetForm

class PasswordReset(PasswordResetForm):
    email = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control form-control-lg', 'placeholder':'Email'}))

class SetPassword(SetPasswordForm):
    new_password1 = forms.CharField(widget=forms.PasswordInput(attrs={'class':'form-control form-control-lg', 'placeholder':'New Password'}))
    new_password2 = forms.CharField(widget=forms.PasswordInput(attrs={'class':'form-control form-control-lg', 'placeholder':'Confirm Password'}))

在 urls.py 上

urlpatterns = [
 path(
        'reset-password/',
        auth_views.PasswordResetView.as_view(template_name='backend/reset-password.html', 
        email_template_name='backend/password-reset-email.html', form_class=PasswordReset), name='password_reset'
     ),

 path(
        'password-reset/<uidb64>/<token>/',
        auth_views.PasswordResetConfirmView.as_view(template_name='backend/password-confirm-form.html',
        form_class=SetPassword), name='password_reset_confirm'
     ),
]

关于 reset-password.html

<form class="pt-3" method="post">
    {% if form.errors %}
    <div class="alert alert-danger">{{ form.errors }}</div>
    {% endif %}
    <div class="form-group">
      {{ form.email }}
    </div>
    <input type='submit' value='Reset Password'>
</form> 

password-confirm-form.html

<form method="post">
{% if form.errors %}
    <div class="alert alert-danger">{{ form.errors }}</div>
{% endif %}
<div class="form-group">
      {{ form.new_password1  }}
</div>
<div class="form-group">
      {{ form.new_password2 }}
</div>
<input type="submit" value="Change Password">
</form> 

【问题讨论】:

    标签: python django django-forms django-messages


    【解决方案1】:

    您需要更新表单中的一些内容。对于SetPassword

    class SetPassword(SetPasswordForm):
        error_messages = {
            'password_mismatch': _('New Passwords and Confirm Passwords not matching'),
        }
    

    并以ResetPassword 形式:

    class PasswordReset(PasswordResetForm):
        def clean_email(self):
            email = self.cleaned_data['email']
            if not User.objects.filter(email = email).exists():
                raise ValidationError('Email not in our database')
            return email
    

    【讨论】:

    • 返回email*, User.objects.filter(email = email)*
    • 谢谢@ruddra,有没有更好的方法?而不是在forms.py上编写额外的代码?是消息在模板上呈现方式的问题吗?
    猜你喜欢
    • 2018-12-16
    • 2020-12-20
    • 2018-04-24
    • 2019-01-30
    • 2016-01-20
    • 1970-01-01
    • 2012-05-09
    • 2020-06-03
    • 2019-06-11
    相关资源
    最近更新 更多