客户端要求管理人员能够将用户添加到公司(随机一次密码),在该公司中,用户必须在访问任何内容之前更改密码。我正在Django 2.2中开发应用程序
我创建了一个自定义用户,用电子邮件地址替换用户名,并向用户添加了一个change_password bool标志。我的change_password表单/函数工作正常,但重定向不起作用。
urls.py
path('change-password/', views.change_password, name='change-password'),views.py
class Login(LoginView):
def form_valid(self, form):
# form is valid (= correct password), now check if user requires to set own password
if form.get_user().change_password:
return HttpResponseRedirect(reverse('change-password'))
else:
auth_login(self.request, form.get_user())
return HttpResponseRedirect(self.get_success_url())
def change_password(request):
if request.method == 'POST':
form = PasswordChangeForm(data=request.POST, user=request.user)
if form.is_valid():
form.save()
request.user.change_password = False
request.user.save()
update_session_auth_hash(request, request.user)
return redirect(reverse('user_view'))
else:
return redirect(reverse('change-password'))
else:
form = PasswordChangeForm(user=request.user)
args = {'form': form}
return render(request, 'users/change_password.html', args)但是,如果change_password标志为True,则预期的行为是重定向到更改密码,而应用程序则重定向到更改密码,提交后将引发以下错误:
NotImplementedError: Django没有为AnonymousUser提供DB表示。
如果我将装饰器@login_required添加到我的change_password函数中,那么这个错误就会消失,但是,我会被重定向回登录页面,其中URL是:user/ login /next=/change_password/change_password/
发布于 2019-07-02 16:37:27
问题是,在form_valid方法中,您正在调用form.get_user(),该方法对用户进行身份验证/获取并正确检查change_password,但它没有登录用户,这意味着发出请求的用户对系统仍然是匿名的。因此,当用户被重定向时,没有对它们进行身份验证,这意味着request.user对象的类型是AnonymousUser,它不存在于数据库中,因此Django没有为AnonymousUser错误提供DB表示。
当您使用@login_required装饰器时,用户会被重定向到登录页面,因为它不是登录用户,而且装饰器要求用户登录查看它正在装饰的视图。
您看到的users/login/?next=/users/change-password/基本上是login_required装饰器的工作方式,它正在做两件事: 1.将匿名用户重定向到登录页面( URL的users/login部分) 2.一旦他们成功登录,就可以从他们的来源(?next=/users/change-password/)重定向他们。
我的建议是,将试图登录但必须更改其密码的用户的用户名传递给change_password视图,并有一个表单等待那里的用户请求当前密码、新密码和新密码的确认。这是做你想做的事情的最简单的方法,但是你必须确认用户当前的密码是正确的。
很抱歉,第一个答案让人困惑,我第一次没读到这个问题,希望这更有意义:)
https://stackoverflow.com/questions/56855044
复制相似问题