我的用户个人资料模型中有一个字段,用于查看用户是否
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
...
password_change_required = models.BooleanField(default=True)
他们是否可以像这样重定向所有观点:
if request.user.profile.password_change_required:
redirect(....)
我可以在哪里放置这个逻辑,以便它能够点击所有视图?
答案 0 :(得分:4)
使用Middleware:
在请求阶段,在调用视图之前,Django适用 中间件按顺序在MIDDLEWARE中自上而下定义。
你可以把它想象成一个洋葱:每个中间件类都是一个“层” 包裹视图,这是洋葱的核心。如果请求 穿过洋葱的所有层(每个人都打电话 get_response将请求传递到下一层),一直到 在核心视图中,响应将通过每一层 (在相反的顺序)回来的路上。
如果其中一个层决定短路并返回响应 没有调用它的get_response,没有洋葱层 在该层内(包括视图)将看到请求或 响应即可。响应只会通过相同的层返回 请求传入。
只要您的订购正确(例如,在使用auth中间件后request.user
可用),哪个应该按照您的要求执行。
答案 1 :(得分:0)
class ProfileUpdateView(UpdateView):
def get(self, request, *args, **kwargs):
if not request.user.profile.password_change_required:
return super(ProfileUpdateView, self).get(request, *args, **kwargs)
else:
return redirect('/accounts/change-password/?next=%s' % request.path)
确保您还导入重定向
from django.shortcuts import redirect