繁体   English   中英

如何让 Django auth SetPasswordForm 显示错误?

[英]How can I get the Django auth SetPasswordForm to display errors?

我正在使用 Django 的SetPasswordForm来允许用户重置他们自己的密码。他们将收到一封电子邮件并点击一个链接,将他们定向到: /users/new-password/uid/token

网址.py

path('new-password/<uidb64>/<str:token>/', views.NewPassword.as_view(), name='new-password'),
path('new-password-post/', views.NewPasswordPost.as_view(), name='new-password-post'),

视图.py

class NewPassword(View):
    url = 'users/new_password.html'

    def get(self, request, uidb64, token):
        try:
            uid = force_text(urlsafe_base64_decode(uidb64))
            user = User.objects.get(pk=uid)
        except (TypeError, ValueError, OverflowError, User.DoesNotExist):
            user = None

        if user is None or not account_activation_token.check_token(user, token):
            text = 'Your password cannot be reset. Please contact support.'
            messages.error(request, text)
            return HttpResponseRedirect(reverse('account'))

        password_form = SetPasswordForm(user=user)
        context = {
            'password_form': password_form,
            'uidb64': uidb64,
            'token': token,
        }
        return render(request, 'users/new_password.html', context)


class NewPasswordPost(View):
    url = 'users/new_password.html'

    def post(self, request):
        uidb64 = request.POST['uidb64']
        token = request.POST['token']
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
        password_form = SetPasswordForm(request.POST)
        if not password_form.is_valid():
            for field in password_form.fields.items():
                print(field, field[1].error_messages)
            context = {
                'password_form': password_form,
                'uidb64': uidb64,
                'token': token,
                }
            return render(request, self.url, context)
        messages.success(request, 'Your password has been reset. You may now sign in.')
        password_form.save()
        return render(request, reverse('login'), context)

新密码.html

<form method="post" action="{% url 'new-password' %}">
{% csrf_token %}
    <h1>Set New Password</h1>
    <table>
        {% for field in password_form %}
            <tr>
                <td>{{ field.label_tag }}</td>
                <td>{{ field }}</td>
                {% if field.errors %}
                    {% for error in field.errors %}
                        <td style="color: red">{{ error }}</td>
                    {% endfor %}
                {% endif %}
            </tr>
        {% endfor %}
    </table>
    <button type="submit" class="btn btn-success">Submit</button>
    <input type="hidden" id="uidb64" name="uidb64" value="{{ uidb64 }}">
    <input type="hidden" id="token" name="token" value="{{ token }}">
</form>

NewPasswordPost 中的打印语句给出:

('new_password1', <django.forms.fields.CharField 对象在 0x7f4a53d94940>) {'required': '这个字段是必需的。'}

('new_password2', <django.forms.fields.CharField 对象在 0x7f4a53d94130>) {'required': '这个字段是必需的。'}

但我在SetPasswordForm上没有看到任何错误,例如密码不匹配

Use :- print = form.errors in signup view

问题是我没有在NewPasswordPost类中正确引用表单(并且没有正确更新用户)。

旧版本

def post(self, request):
    ...
    password_form = SetPasswordForm(request.POST)
    if not password_form.is_valid():
        context = {
            'password_form': password_form,
            'uidb64': uidb64,
            'token': token,
            }
        return render(request, self.url, context)
    password_form.save()
    ...

工作版本

def post(self, request):
    ...
    password_form = SetPasswordForm(request.user, request.POST)
    if not password_form.is_valid():
        context = {
            'password_form': password_form,
            'uidb64': uidb64,
            'token': token,
            }
        return render(request, self.url, context)
    user = User.objects.get(pk=uid)
    new_password = request.POST['new_password1']
    user.set_password(new_password)
    user.save()
    ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM