我有两种类型的用户使用一个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?
答案 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
设置创建自定义视图,并在那里处理基于权限的重定向。