Django-强制用户重置初始密码

时间:2018-11-02 20:32:26

标签: django django-views django-urls

我正在实现一项功能,在该功能中,用户被迫更改密码(即,如果管理员创建了初始密码,则要求用户在下次登录时更改该密码)。我正在使用Django Contrib Auth软件包。

为此,我通过布尔参数force_password_change扩展了用户个人资料:

class Profile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  force_password_change = models.BooleanField(default=True)

我认为我正在扩展标准LoginView

class MyLoginView(LoginView):
  def form_valid(self, form):
      # form is valid (= correct password), now check if user requires to set own password
      if form.get_user().profile.force_password_change:
          return HttpResponseRedirect('password_change')
      else:
          auth_login(self.request, form.get_user())
          return HttpResponseRedirect(self.get_success_url())

单击login按钮后,系统呈现404页面未找到错误:The current path, accounts/login/, didn't match any of these.

我注意到,当我在auth_login(self.request, form.get_user())之前添加HttpResponseRedirect('password_change')时,效果很好。但这也意味着用户(不正确地)被认证。

urls.py

path('', myapp.MyLoginView.as_view(), name='login'),
path('password_change/', myapp.MyPasswordChangeView.as_view(), name='password_change'),

为什么会这样?为什么404错误引用了accounts/login/

2 个答案:

答案 0 :(得分:0)

您需要使用reverse来解析网址名称:

from django.urls import reverse

class MyLoginView(LoginView):
    def form_valid(self, form):
        # form is valid (= correct password), now check if user requires to set own password
        if form.get_user().profile.force_password_change:
            return HttpResponseRedirect(reverse('password_change'))
        else:
            auth_login(self.request, form.get_user())
            return HttpResponseRedirect(self.get_success_url())

答案 1 :(得分:0)

使用User.set_unusable_password,然后假设您的密码更改视图称为“更改密码”:

将此添加到您的登录视图:

from django.http import HttpResponseRedirect
from django.urls import revese

if not user.has_usable_password():
    return HttpResponseRedirect(reverse('change-password')