我要求每当我登录或尝试请求具有login_decorator的视图时,下一页就是要求用户选择业务实体的页面(不论所请求的原始视图如何)。
假设页面为http://127.0.0.1:8999/APP/business_unit
为实现这一目标,我在settings.py中配置了以下内容
LOGIN_REDIRECT_URL='/APP/business_unit_selector'
现在,当我尝试访问http://127.0.0.1:8999/APP/range_list
时
页面转到http://127.0.0.1:8999/APP/login?next=/APP/range_list
我希望登录后的下一页是/APP/business_unit
但相反,下一页是/APP/range_list
浏览器地址栏有http://127.0.0.1:8999/APP/login?next=/APP/range_list
是否有可能在Django中实现我的目标?
答案 0 :(得分:2)
LOGIN_REDIRECT_URL
时,将使用 next
。在您的测试请求中有next=/APP/range_list
- 该地址用于在登录后重定向用户。
可能最简单,最有效的解决方案是制作自己的装饰器,类似于login_required
,如果未选择单位,则会重定向到/APP/business_unit_selector&next=<redirect_url>
,并将其与login_required
一起应用。就重定向数而言,它不是最有效的解决方案,但是非常干净,并且不会弄乱登录页面。
如果您希望获得自然流量,还必须在next
视图中处理business_unit_selector
参数。
你的装饰者应该是
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.shortcuts import redirect
from django.utils.http import urlquote
import functools
def business_unit_required(view):
@login_required # probably you want to incorporate it here
@functools.wraps(view)
def wrapped(request, *args, **kwargs):
if not 'selected_business_unit' in request.session:
return redirect('%s?next=%s' % (
reverse('business_unit_selector'),
urlquote(request.get_full_path())))
return view(request, *args, **kwargs)
return wrapped
答案 1 :(得分:1)
登录后http://127.0.0.1:8999/APP/login?next=/APP/range_list
将您重定向到range_list
的原因是因为next=
您覆盖了设置文件LOGIN_REDIRECT_URL='/APP/business_unit_selector'
中指定的内容。< / p>
如果我理解正确,您需要用户在登录后选择一个商业实体。
我想到的几个解决方案如下:
1。)不要为登录和业务实体使用单独的表单。而是组合它们。
Username
Password
Business Entity
2。)您还可以在视图中指定用户是否没有商务实体ResponseRedirect(&#34; / APP / business_unit_selector&#34;) docs here