密码更改后显示消息?

时间:2012-11-14 16:52:19

标签: django django-authentication

我正在使用django提供的default change password mechanism

我正在使用post_change_redirect将提交的表单直接返回到我的设置页面,但是我想显示一条消息,向用户保证操作已成功。如何通过密码更改成功检测我是否到达设置视图,并为此添加消息?

2 个答案:

答案 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提供的答案:

  • 该表单的行为几乎与默认密码更改机制相同。
  • 重复代码少。
相关问题