我通过我的 login.html
页面上的表单使用django 's '登录视图:
<form class="form-horizontal" method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}
<div class="control-group">
<div class="controls">
{{ form.username }}
</div>
<div class="controls controlsbtm">
{{ form.password }}
</div>
</div>
<div class="control-group-bottom">
<div class="controls-btm">
<input type="submit" value="Sign In" class="loginBtn" />
<input type="hidden" name="next" value="{{ next }}" />
</div>
</div>
</form>
如果用户是特定组的一部分,我有一个自定义装饰器来检查某些页面,如果他们不是,我将它们重定向回登录页面 . 使用:
@login_required
@user_passes_test(is_admin)
问题是,djangos内置了返回登录页面并成功登录的功能,使您返回到上一个URL . 因此,如果您登录并且您不在该组中,您将陷入循环 .
我想这样:
以B组中的用户身份登录
尝试需要A组用户的URL
- 返回登录页面
以B组中的用户身份登录
- 返回标准主页,不重定向回上一个网址
要么
以A组用户身份登录
- 重定向回以前的网址
我该怎么做呢?
**按照雅各布的想法编辑后,我已经达到了可以将REDIRECT_URL指向自定义视图的程度 . 但在这种观点中,我需要能够说:
原始URL希望用户做什么?
这是否与新登录的详细信息匹配,如果是,请转到该URL,如果没有,请转到home.html
我仍然不确定如何做到这一点
2 回答
你可以使用Settings.LOGIN_REDIRECT_URL .
通过这种方式,您可以重定向到其他视图,您可以在其中进行组检查并从那里再次重定向到正确的位置 .
编辑:设置LOGIN_REDIRECT_URL仅在删除下一个参数时有效 . 来自文档:
Here是一个描述如何操作的问题 .
覆盖contrib.auth.login可能是另一种方法 . 让Django做默认的登录工作,然后查看你的小组 . 然后重定向到正确的位置(通过下一个参数) .
EDIT2:
如果我找对了你想要一些如下设置:总是在失败时返回登录页面 .
以组A中的用户身份登录:is_admin => True(在组中)=>在成功时重定向到上一页
以组B中的用户身份登录:is_admin => False(不在组中)=>重定向到默认(登录保护)页面
试试这个:
urls.py
views.py
希望这可以帮助!
这对我有用: