使用基于类的视图(CBV)Django 2.1 Python重定向页面

时间:2018-12-31 20:17:13

标签: django python-3.x redirect django-class-based-views class-based-views

我想根据用户的角色将用户定向到特定页面。我想在基于类的视图中实现这样的事情。

def home_redirect(request):
    user_role = Profile.objects.get(user = request.user).role
    if user_role in internal_users:
        return redirect(reverse_lazy('home'))
    else:
        return redirect(reverse_lazy('event_list'))

我知道RedirectView。但是,如何才能像在request.user.role中那样获取CBV中的请求以获取user.role?我知道我可以像这样在CBV中的 某些功能中获得user.role:

class HomeRedirectView(RedirectView):
    def get_context_data(self, **kwargs):
        context = super(HomeRedirectView, self).get_context_data(**kwargs)
        context['current_user'] = Profile.objects.get(user = self.request.user)
        user_role = context['current_user'].role
        return context

    #Can't access user_role but if I could I would do something like this
    if user_role in internal_users:
        url = reverse_lazy('home')
    else:
        url = reverse_lazy('event_list')

如何在CBV中的get_context_data()之外访问user_role?

1 个答案:

答案 0 :(得分:3)

RedirectView [Django-doc]中,您无需实现get_context_data函数,URL由get_redirect_url method [Django-doc]确定,因此可以将其实现为:

class HomeRedirectView(RedirectView):

    def get_redirect_url(self, *args, **kwargs):
        user_role = Profile.objects.get(user=self.request.user).role
        if user_role in internal_users:
            return reverse('home')
        else:
            return reverse('event_list')

仅在URL静态的情况下设置url attribute [Django-doc],但是如果内容是非静态的,则可以实现get_redirect_url