Use LoginRequiredMixin and UserPassesTestMixin at the same time

前端 未结 2 473
广开言路
广开言路 2021-01-05 03:56

I want to have a TemplateView Class that uses LoginRequiredMixin and UserPassesTestMixin at the same time. Something like this:

from django.views.generic imp         


        
相关标签:
2条回答
  • 2021-01-05 04:28

    I think you're better off subclassing AccessMixin and then performing these checks yourself. Something like this:

    from django.contrib.auth.mixins import AccessMixin
    from django.http import HttpResponseRedirect 
    
    class FinanceOverview(AccessMixin, TemplateMixin):
    
        def dispatch(self, request, *args, **kwargs):
            if not request.user.is_authenticated:
                # This will redirect to the login view
                return self.handle_no_permission()
            if not self.request.user.groups.filter(name="FinanceGrp").exists():
                # Redirect the user to somewhere else - add your URL here
                return HttpResponseRedirect(...)
    
            # Checks pass, let http method handlers process the request
            return super().dispatch(request, *args, **kwargs)
    
    0 讨论(0)
  • 2021-01-05 04:35

    You should override get_login_url:

    class FinanceOverview(LoginRequiredMixin, UserPassesTestMixin, TemplateMixin):
        login_url = '/login'
        redirect_field_name = 'next'
    
        def test_func(self):
            return self.request.user.groups.filter(name="FinanceGrp").exists()
    
        def get_login_url(self):
            if self.request.user.is_authenticated:
                return URL_FOR_AUTHENTICATED_USERS
            return super().get_login_url()
    
        def get(self, request, *args, **kwargs):
            DO SOMETHING IF USER IS AUTHENTICATED AND ALSO MEMBER OF GROUP FinanceGrp
    
    0 讨论(0)
提交回复
热议问题