2016-04-28 1 views
0

J'ai un LoginForm pour deux types d'utilisateurs, jusqu'à ce que tout fonctionne correctement. Le problème vient quand je fais LoginRequiredMixin pour n'importe quelle vue, je ne sais pas pourquoi mais redirige vers le success_url du formulaire de connexion. Voici mon LoginForm:Un formulaire de connexion pour deux types de comptes et LoginRequiredMixin dans django

form_valid méthode rediriger les utilisateurs dépend des perms dont il dispose.

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') 

Voici mon point de vue avec un LoginRequiredMixin:

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

Disons que c'est l'URL lorsqu'un utilisateur non authentifié tente d'accéder: http://127.0.0.1:8000/entrar/?next=/panel/detalle-solicitud/declaracion-de-renta. Et laisse indique que l'utilisateur a perm de « is_professional » Il supose qui doivent rediriger vers /panel/detalle-solicitud/declaracion-de-renta mais au lieu de cela redirigeant vers /panel/inicio/, l'URL du instrucion de form_valid

Nouvelle méthode form_valid uniquement pour le test pour obtenir next variable:

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) 

Comment puis-je respecter l'URL de LoginRequiredMixin?

Répondre

1

Il n'y a rien dans Django qui gère magiquement ?next=... dans l'URL. Vous devez aller chercher la valeur à request.GET. Notez que vous ne devriez pas faire confiance à la valeur de l'utilisateur - Django a une méthode is_safe_url que vous pouvez utiliser.

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 

Vous trouverez peut-être plus facile d'utiliser la built in login view pour gérer les connexions. Vous pouvez ensuite créer une vue personnalisée pour le paramètre LOGIN_REDIRECT_URL et gérer les redirections basées sur les autorisations.

+0

@Alasdir Je l'ai implémenté, mais la méthode form_valid ne peut pas obtenir la variable suivante. – dfrojas

+0

Il ne devrait pas y avoir de problème pour obtenir la variable 'next' de la méthode' form_valid'. Assurez-vous que vous utilisez 'self.request.GET', j'avais écrit' request.GET' avant. – Alasdair

+0

Cela ne fonctionne pas, jetez un oeil à ma méthode form_valid, qu'est-ce que je fais mal? Toujours affiche "Aucun". J'ai édité ma question – dfrojas