2016-04-28 20 views
0

我有兩種類型的用戶的LoginForm,直到這裏一切正常。問題出現在我爲任何視圖執行LoginRequiredMixin時,我不知道爲什麼,但是重定向到登錄表單的success_url。這裏是我的登錄表單:Django中的兩種帳戶和LoginRequiredMixin的一個登錄表單

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' 

比方說,這是URL時未通過身份驗證的用戶試圖訪問:http://127.0.0.1:8000/entrar/?next=/panel/detalle-solicitud/declaracion-de-renta。並讓說,用戶的「is_professional」這supose燙髮有重定向到/panel/detalle-solicitud/declaracion-de-renta但不是被重定向到/panel/inicio/form_valid

form_valid方法instrucion的URL只爲測試,以獲得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

在Django中沒有什麼能神奇地處理URL中的?next=...。您必須從request.GET獲取值。請注意,您不應該相信用戶的值 - Django有一個可以使用的is_safe_url方法。

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 

您可能會發現使用built in login view來處理登錄更容易。然後,您可以爲LOGIN_REDIRECT_URL設置創建自定義視圖,並在那裏處理基於權限的重定向。

+0

@Alasdir我實現了它,但form_valid方法不能獲取下一個變量。 – dfrojas

+0

從'form_valid'方法獲取'next'變量應該沒有問題。確保你使用'self.request.GET',我之前寫過'request.GET'。 – Alasdair

+0

它不起作用,看看我的form_valid方法,我做錯了什麼?始終打印「無」。我編輯了我的問題 – dfrojas