我正在使用django'登录视图'通过我的login.html
页面上的表单:
<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组用户的网址
以B组用户身份登录
OR
以A组用户身份登录
我将如何做到这一点?
**编辑 按照雅各布的想法,我已经达到了可以将REDIRECT_URL指向自定义视图的程度。 但在这种观点中,我需要能够说:
原始网址希望用户做什么?
是否与新登录的详细信息匹配,如果是,请转到该URL 如果没有,请转到home.html
我仍然不确定如何做到这一点
答案 0 :(得分:1)
您可以使用Settings.LOGIN_REDIRECT_URL。
使用此功能,您可以重定向到其他视图,您可以在其中进行组检查并再次从那里重定向到正确的位置。
编辑: 设置LOGIN_REDIRECT_URL仅在删除下一个参数时有效。来自文档:
在contrib.auth.login登录后重定向请求的URL 查看没有下一个参数。
Here是一个描述如何操作的问题。
覆盖contrib.auth.login可能是另一种方法。让Django做默认的登录工作,然后查看你的小组。然后重定向到正确的位置(通过下一个参数)。
<强> EDIT2:强>
如果我说得对,你需要一些如下设置: 总是在失败时返回登录页面。
试试这个:
urls.py
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls), name='nasenb'),
url(r'^login/', login, {'template_name': 'admin/login.html'}),
url(r'^adminonly/', admin_only),
url(r'^protected/', protected_content),
url(r'^', free_content, name='index'),
)
views.py
def is_admin(user):
return True #or False for test purpose
# login_url='/protected/': this is the default redirect url
# where to go if is_admin fails but the login succeeded
@login_required()
@user_passes_test(is_admin, login_url='/protected/', redirect_field_name=None)
def admin_only(request):
return HttpResponse('Access granted, passed "is_admin"')
@login_required()
def protected_content(request):
return HttpResponse('this content does''n require admin privs')
"""
this is some previous page
"""
def free_content(request):
return HttpResponse('Some data! Free for everyone!')
希望这有帮助!
答案 1 :(得分:1)
This worked for me:
from django.http import HttpResponseRedirect
def loggedin_view(request):
usergroup = None
if request.user.is_authenticated():
usergroup = request.user.groups.values_list('name', flat=True).first()
if usergroup == "staffGroup":
return HttpResponseRedirect("/cmit/userDash")
elif usergroup == "supervisorGroup":
return HttpResponseRedirect("/cmit/supervisorDash")
elif usergroup == "auditGroup":
return HttpResponseRedirect("/cmit/auditDash")
elif usergroup == "mgtGroup":
return HttpResponseRedirect("/cmit/mgtDash")
else:
return HttpResponseRedirect("/admin/")