Django:login后redirect到上一页

我试图build立一个简单的网站loginfunction非常类似于这里的一个。 用户应该能够以匿名用户的身份浏览网站,每个网页上都会有一个login链接。 当点击login链接时,用户将被带到login表单。 成功login后,用户应该被带回到他首先点击login链接的页面。 我猜我必须以某种方式将当前页面的URL传递给处理login表单的视图,但是我无法真正地使其工作。

编辑:我想通了。 我通过传递当前页面作为GET参数链接到login表单,然后使用“下一个”redirect到该页面。 谢谢!

编辑2:我的解释似乎没有明确所以要求这里是我的代码:可以说,我们在页面foo.html,我们没有login。现在我们想有一个链接foo.html链接到login.html。 在那里,我们可以login,然后redirect到foo.html。 foo.html上的链接如下所示:

<a href='/login/?next={{ request.path }}'>Login</a> 

现在我写了一个自定义的login视图,看起来有点像这样:

 def login_view(request): redirect_to = request.REQUEST.get('next', '') if request.method=='POST': #create login form... if valid login credentials have been entered: return HttpResponseRedirect(redirect_to) #... return render_to_response('login.html', locals()) 

而login.html中的重要行:

 <form method="post" action="./?next={{ redirect_to }}"> 

所以呢,这是非常多的,希望能够说清楚。

您无需对此进行额外的查看,function已经内置。

首先,每个带有login链接的页面都需要知道当前path,最简单的方法是将请求上下文preprosessor添加到settings.py(首先是default 4),然后请求对象将在每个请求中可用:

settings.py:

 TEMPLATE_CONTEXT_PROCESSORS = ( "django.core.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.core.context_processors.request", ) 

然后添加你想要的login链接的模板:

base.html文件:

 <a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Login</a> 

这将为login页面添加GET参数,该页面指向当前页面。

login模板可以如此简单:

登记/ login.html的:

 {% block content %} <form method="post" action=""> {{form.as_p}} <input type="submit" value="Login"> </form> {% endblock %} 

这可能不是一个“最佳实践”,但我已经成功地使用过这个:

 return HttpResponseRedirect(request.META.get('HTTP_REFERER','/')) 

要使用参数/值支持完整的URL,您需要:

 ?next={{ request.get_full_path|urlencode }} 

而不仅仅是:

 ?next={{ request.path }} 

Django的内置身份validation以您想要的方式工作。

他们的login页面包括next查询string,这是login后要返回的页面。

看看http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required

我通过传递当前页面作为GET参数链接到login表单,然后使用“下一个”redirect到该页面。 谢谢!

我遇到了同样的问题。 这个解决scheme允许我继续使用通用的login视图:

 urlpatterns += patterns('django.views.generic.simple', (r'^accounts/profile/$', 'redirect_to', {'url': 'generic_account_url'}), ) 

registration/login.html (嵌套在templates文件夹中),如果插入以下行,页面将呈现如Django原始的pipe理员login页面:

 {% include "admin/login.html" %} 

注意:该文件只能包含上面的行。

请参阅django文档views.login() ,您提供一个“下一个”值(作为一个隐藏的领域)的input表单,以成功login后redirect到。

你也可以做到这一点

 <input type="hidden" name="text" value="{% url 'dashboard' %}" />