【问题标题】:Show message after password change?更改密码后显示消息?
【发布时间】:2012-11-03 05:14:11
【问题描述】:
【问题讨论】:
标签:
django
django-authentication
【解决方案1】:
当用户成功更改密码时,您可以继承 django.contrib.auth.views.PasswordChangeView 以使用 Django messages framework 添加消息。
在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'),
# ...
]
这个答案在以下方面改进了@enginoid 提供的答案:
- 该表单的行为与默认密码更改机制几乎相同。
- 代码重复更少。
【解决方案2】:
我不建议在设置视图中检查用户是否通过密码更改到达。我认为理想情况下,密码更改的所有逻辑都包含在同一个地方。这使得查找逻辑更容易,并且不需要设置视图了解密码更改视图(因此您可以轻松更改逻辑以将用户重定向到其他地方)。
最好的办法是根据PasswordChangeForm 编写自己的视图,而不是使用内置的password_change 视图。使用这种方法,您可以使用the message framework 来显示成功消息。 (您还必须启用消息框架并将其标记放在您的视图中。)
例如,如果您想显示一条简单的消息并重定向回名为 'settings' 的 URL 模式,您可以编写如下视图:
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 视图将来会基于类,允许使用更少的样板实现相同的行为。
【讨论】:
-
与默认密码更改机制不同,此解决方案将注销用户。为了尽可能多地保留默认行为,最好将django.contrib.auth.views.PasswordChangeView 子类化。见this solution。