我使用内置的PasswordChangeForm类,但是我重写了模板的html,因为我不喜欢错误消息的默认位置(奇怪地位于“新密码”字段和“新密码确认”字段之间)。
当我正确填写新旧密码时,我的表单可以使用。否则,页面将重新加载而没有指示。
当它起作用时,我将重定向到“ PasswordChangeDoneView”页面。 理想情况下,我希望不要被重定向,但这并不重要。
url.py:
path('password_change/', auth_views.PasswordChangeView.as_view(), name = 'password_change'),
path('password_change_done/', auth_views.PasswordChangeDoneView.as_view(), name = 'password_change_done'),
views.py:
@login_required
def password_change(request):
if request.method == 'POST':
password_form = PasswordChangeForm(instance = request.user, data = request.POST)
if password_form.is_valid():
password_form.save()
update_session_auth_hash(request, password_form.user) # <-- keep the user loged after password change
messages.success(request, 'Your password was successfully updated!', extra_tags='safe')
else:
messages.error(request, 'Something went wrong', extra_tags='safe')
else:
password_form = PasswordChangeForm(instance = request.user)
return render(request, 'registration/password_change_form.html', {'password_form': password_form})
password_change_form.html:
<form action='.' method='post' enctype='multipart/form-data'>
<p>
<label for='id_old_password'>Old password:</label>
<input type='password' name='old_password' autofocus='' required='' id='id_old_password'>
</p>
{% if messages %}
{% for message in messages %}
<p class='border-alert {{ message.tags }}'>{{ message|safe }}</p>
{% endfor %}
{% endif %}
<p>
<label for='id_new_password1'>New password:</label>
<input type='password' name='new_password1' required='' id='id_new_password1'>
<span class='helptext'></span>
</p>
<p>
<label for='id_new_password2'>New password confirmation:</label>
<input type='password' name='new_password2' required='' id='id_new_password2'>
</p>
{% csrf_token %}
<p><input type='submit' value='Change you password' class='btn w100'></p>
</form>
此页面底部可见Django PasswordChangeForm类:https://github.com/django/django/blob/master/django/contrib/auth/forms.py
编辑:
通过对代码的以下更改,我几乎解决了我的问题:
现在在我的 views.py 中,我有了这个:
@login_required
def password_change(request):
password_form = PasswordChangeForm(instance = request.user, data = request.POST)
if request.method == 'POST':
if password_form.is_valid():
password_form.save()
update_session_auth_hash(request, password_form.user) # <-- keep the user loged after password change
return render(request, 'registration/password_change_form.html', {'password_form': password_form})
在我的模板中,我使用了这个
:{% for field in form %}
{{ field.errors }}
{% endfor %}
我不再在模板中使用{%if messages%}部分。
错误消息是“提供的Django内置功能”,当我正确填写输入内容后,我将重定向到“更改密码成功视图”。
答案 0 :(得分:0)
这是正在发生的事情,
在您看来,您不会重定向到任何其他页面。这意味着您再次请求相同的表格。由于这是一个表单获取函数,因此您的成功消息始终为False。
然后您可以执行以下其中一项操作
添加form.errors。当您使用Django的内置密码重置表单时。如果您的密码不匹配或旧密码不正确,则会显示错误。
重定向到个人资料页面或任何其他页面。在此处添加消息标签。它将在该页面中完美运行。
(我没有尝试过,通常我会重定向到个人资料页面并在其中显示消息,但是如果您愿意,可以尝试,不确定是否可以使用),
def password_change(request):
form = #add form
success = False
if request.method == 'POST':
if form.is_valid():
form.save()
update_session_auth_hash(request, password_form.user)
form = #add form
success = True
return render(request, 'template.html', {'form': form})