成功登录后的Django重定向

时间:2015-03-16 17:00:32

标签: django django-authentication

我要求每当我登录或尝试请求具有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中实现我的目标?

2 个答案:

答案 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