我正在使用django提供的default change password mechanism。
我正在使用post_change_redirect
将提交的表单直接返回到我的设置页面,但是我想显示一条消息,向用户保证操作已成功。如何通过密码更改成功检测我是否到达设置视图,并为此添加消息?
答案 0 :(得分:7)
我不建议在设置视图中检查用户是否通过密码更改到达。我认为理想情况下,密码更改的所有逻辑都包含在同一个地方。这样可以更容易地找到逻辑,并且不需要设置视图来了解密码更改视图(因此您可以轻松更改逻辑以将用户重定向到其他位置)。
最好的办法是根据PasswordChangeForm
编写自己的观点,而不是使用内置的password_change
视图。使用此方法,您可以使用the message framework显示成功消息。 (您还必须启用消息框架并将其标记放在您的视图中。)
例如,如果您想显示一条简单的消息并重定向回名为'settings'
的网址格式,您可以编写一个这样的视图:
from django.contrib import messages
from django.contrib.auth.forms import PasswordChangeForm
from django.core.urlresolvers import reverse_lazy
from django.views.generic import FormView
class PasswordChangeView(FormView):
template_name = 'registration/password_change_form.html'
form_class = PasswordChangeForm
success_url = reverse_lazy('settings')
def get_form_kwargs(self):
kwargs = super(PasswordChangeView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
def form_valid(self, form):
form.save()
messages.success(self.request, "Your password has been changed.")
return super(FormView, self).form_valid(form)
希望password_change
视图将来会以类为基础,允许相同的行为,甚至更少的样板。
答案 1 :(得分:0)
当用户成功更改密码后,您可以使用Django messages framework来创建django.contrib.auth.views.PasswordChangeView
的子类。
在views.py
中:
from django.contrib import messages
from django.contrib.auth.views import PasswordChangeView
from django.urls import reverse_lazy
class CustomPasswordChangeView(PasswordChangeView):
# Optional (default: 'registration/password_change_form.html')
template_name = 'myapp/my_password_change_form.html'
# Optional (default: `reverse_lazy('password_change_done')`)
success_url = reverse_lazy('settings')
def form_valid(self, form):
messages.success(self.request, 'Your password has been changed.')
return super().form_valid(form)
然后在您应用的urls.py
中:
from django.conf.urls import url
import myapp.views as views
urlpatterns = [
url(r'^settings/password/change/$',
views.CustomPasswordChangeView.as_view(),
name='password_change'),
# ...
]
此答案通过以下方式改进了engnoid提供的答案: