django

时间:2016-04-28 20:30:50

标签: django mixins django-authentication django-login

我有两种类型的用户使用一个LoginForm,直到这里一切正常。当我为任何视图执行LoginRequiredMixin时出现问题,我不知道为什么但是重定向到登录表单的success_url。这是我的LoginForm:

form_valid方法重定向用户取决于他拥有的权限。

class LoginView(FormView):
    form_class = AuthenticationForm
    template_name = 'login.html'

    def dispatch(self,request,*args,**kwargs):
        if request.user.is_authenticated() and request.user.has_perm('users.is_contribuyente'):
            return HttpResponseRedirect('/solicitudes-enviadas')
        if request.user.is_authenticated() and request.user.has_perm('users.is_professional'):
            return HttpResponseRedirect('/panel/inicio')        
        return super(LoginView,self).dispatch(request,*args,**kwargs)


    def form_valid(self,form):
        login(self.request,form.get_user())
        if self.request.user.has_perm('users.is_contribuyente'):
            return redirect('/solicitudes-enviadas')
        if self.request.user.has_perm('users.is_professional'):
            return redirect('/panel/inicio')

此处我的观点为LoginRequiredMixin

class SendQuoteView(LoginRequiredMixin,VerifiedUserMixin,FormMixin,DetailView):
    login_url = '/entrar/'
    model = Request
    form_class = SendQuoteForm
    template_name = 'send_quote.html'

我们假设这是未经过身份验证的用户尝试访问的网址:http://127.0.0.1:8000/entrar/?next=/panel/detalle-solicitud/declaracion-de-renta。并且让我们说用户有#34; is_professional"它必须重定向到/panel/detalle-solicitud/declaracion-de-renta,而不是重定向到/panel/inicio/form_valid的指示的网址

form_valid方法仅用于测试获取next变量:

def form_valid(self, form):
        #login(self.request, form.get_user())
        next = self.request.GET('next')
        print next
        return super(LoginView, self).form_valid(form)

如何实现LoginRequiredMixin的URL?

1 个答案:

答案 0 :(得分:1)

Django中没有任何内容可以在网址中神奇地处理subsasgn。您必须从?next=...获取值。请注意,您不应该信任用户的值 - Django可以使用request.GET方法。

is_safe_url

您可能会发现使用built in login view处理登录更容易。然后,您可以为from django.http.utils import is_safe_url next_url = self.request.GET.get('next') if next_url and is_safe_url(next_url, self.request.get_host()): # redirect to next else: # redirect to fallback 设置创建自定义视图,并在那里处理基于权限的重定向。