【问题标题】:Show message after password change?更改密码后显示消息?
【发布时间】:2012-11-03 05:14:11
【问题描述】:

我使用的是django提供的default change password mechanism

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

【问题讨论】:

标签: 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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多