我正在实现一项功能,在该功能中,用户被迫更改密码(即,如果管理员创建了初始密码,则要求用户在下次登录时更改该密码)。我正在使用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/
?
答案 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')