[英]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.