登录后重定向回到上一页(Django)
我已经在几个页面中创建了登录页面强制登录。现在,我需要在成功登录后重新导向上一页。登录后重定向回到上一页(Django)
当我强制登录@login_required(login_url='/login/')
。它包括查询字符串中的next
参数。
我试着用redirect_to = request.REQUEST.get('next', '')
抓住它,并把它重定向return HttpResponseRedirect(redirect_to)
,但没有奏效。
view.py
def login(request):
def errorHandle(error):
form = LoginForm()
return render_to_response('login/login.html', {
'error' : error,
'form' : form,
})
if request.method == 'POST': # If the form has been submitted...
form = LoginForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
username = request.POST['username']
password = request.POST['password']
redirect_to = request.REQUEST.get('next', '')
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
# Redirect to a success page.
auth_login(request, user)
return HttpResponseRedirect(redirect_to)
# return render_to_response('login/logged_in.html', {
# 'username': username,
# })
else:
# Return a 'disabled account' error message
error = u'Account Disabled'
return errorHandle(error)
else:
# Return an 'invalid login' error message.
error = u'Invalid Login'
return errorHandle(error)
else:
error = u'Form is Invalid'
return errorHandle(error)
else:
form = LoginForm() # An unbound form
return render_to_response('login/login.html', {
'form': form,
})
模板
<div id="login_form">
<form action="." method="post">
{{ form.as_p }}
<input type="submit" value="Login">
</form>
</div>
编辑 - 我发现这个问题。这是我的模板问题。下面的表格工作正常。
<form action="" method="post">
<label for="username">User name:</label>
<input type="text" name="username" value="" id="username">
<label for="password">Password:</label>
<input type="password" name="password" value="" id="password">
<input type="submit" value="Login" id="button"/>
<input type="hidden" name="next" value="{{ next|escape }}" />
</form>
你可以只添加此窗体:
<input type="hidden" value="{% if request.REQUEST.next %}{{ request.REQUEST.next }}{% else %}{% if request.META.HTTP_REFERER %}{{ request.META.HTTP_REFERER }}{% else %}/{% endif %}{% endif %}" name="next" />
下面是它解决了案例:
- 如果用户来自一个login_required视图:接下来的设为通过login_required
- 如果用户来自登录表格(即。认证未通过):下一个=预先设定的下一个值
- 如果用户来自非login_required视图:下一=引荐URL
- 如果用户直接打开登录页面:下一=/
请注意,这也适用于您应该使用的外部登录视图。
作为一个好东西,这里是我的注销模板的一部分,它将用户重定向到注销前的页面。
{% block body %}
<p>{% trans "You've been logged out." %}</p>
{% if '/account/logout/' not in request.META.HTTP_REFERER %}
<p>
{% trans 'You will be redirected in a second' %}
</p>
{% endif %}
{% endblock %}
{% block extra_body %}
{% if '/account/logout/' not in request.META.HTTP_REFERER %}
<script type="text/javascript">
document.location.href = '{{ request.META.HTTP_REFERER }}';
</script>
{% endif %}
{% endblock %}
,我想感谢那些雇我sports pick, tipster social network伟大的启动,因为他们让我为0)共享代码和1)利用我的时间去帮助别人。但是我把它链接起来的真正原因是你可以测试它。如果这个代码不适合你喜欢它在那里工作,那么你有另一个问题。
同样的问题:重塑[*]有什么意义(https://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L25 )? – DrTyrsa 2012-04-03 08:28:52
我猜教育目的是合理的。就我个人而言,多年来我一直没有做过与登录视图相关的任何事情,一直忙于关注让我的应用程序不同的原因......感谢Pinax提供包含所有这些样板的入门项目。但之前,我曾经手动做过这方面的工作,这帮助我了解发生了什么。 – jpic 2012-04-03 08:34:50
我认为,研究内置视图的代码对教育目的更有用。例如,可以了解有关测试Cookie和重定向安全检查的信息。 – DrTyrsa 2012-04-03 08:41:01
为什么不使用内置的[登录](https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login)视图?为什么不至少[看看它的代码](https://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L25)看看它是如何进行重定向的? – DrTyrsa 2012-04-03 07:53:08
@DTTyrsa我不知道如何使用内置登录:/你可以发现这个代码的问题? – ChamingaD 2012-04-03 08:14:37
你有没有阅读[文档](https://docs.djangoproject.com/en/dev/topics/auth/)auth?那里有什么不清楚的地方? – DrTyrsa 2012-04-03 08:28:15