如果符合条件,则重定向django中的所有视图

时间:2017-01-01 03:57:54

标签: python django django-views

我的用户个人资料模型中有一个字段,用于查看用户是否

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(....)

我可以在哪里放置这个逻辑,以便它能够点击所有视图?

2 个答案:

答案 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