重定向/返回到Django中的相同(上一个)页面?
Posted
技术标签:
【中文标题】重定向/返回到Django中的相同(上一个)页面?【英文标题】:Redirect / return to same (previous) page in Django? 【发布时间】:2012-09-27 08:23:36 【问题描述】:当您想在 Django 中将用户返回到同一页面时,有哪些选项,每个选项的优缺点是什么?
我知道的方法:
HTTP_REFERER GET 参数包含上一个 URL 用于存储前一个 URL 的会话数据还有其他的吗?
【问题讨论】:
链接显示“登录后”。我是否问过“登录后”?这个问题可以是这个主题的真实概述。它不值得-1,它值得+1。哎呀 相反,逻辑与 get 或 post 没有什么不同,它只是一个重定向问题,在您定义一些推理之前没有任何利弊,您的问题很广泛,没有适当的研究或试验. 这是非常不同的。内置 Django 登录和 cmets 重定向。我的问题是针对其他情况的;) 这绝对不是建议的错误的副本。 “重复”是重定向到登录页面后的重定向,这通常是返回到引用页面的重定向(考虑从详细信息或编辑页面返回到列表页面)。请删除无效的重复标志。 +1 用于删除重复禁令。这个问题在谷歌中是这个搜索词的第一名,只有一个答案,但会有多种(更好的?)方法来解决这个问题。它与登录情况无关。 【参考方案1】:其中一种方法是使用HTTP_REFERER
标头,如下所示:
from django.http import HttpResponseRedirect
def someview(request):
...
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
不确定这样做的缺点!
【讨论】:
我认为最大的问题是许多用户/浏览器都关闭了 http_referer。 你知道关闭页眉有多难吗?大多数用户不知道它是什么,更不用说如何关闭它了。在 Firefox 和 Chrome 中,您必须手动编辑首选项(同样,没有多少人知道如何做到这一点);在 IE 中,您根本无法禁用它(对于安全站点,它会自动禁用)。 我认为如果没有设置request.META,重定向到网站主页会更好:return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/') ) 另一个缺点是,如果在提交过程中验证失败,并且用户必须更正一些文件并重新提交,那么 HTTP_REFERER 将是表单的 url。 如果您还想保持滚动位置,请参阅this 回答。【参考方案2】:虽然问题和答案很旧,但我认为它缺少一些选项。我没有发现这些方法有任何缺点,我很乐意知道是否有任何缺点?
request.path_info request.get_full_path()request.build_absolute_uri()
from django.shortcuts import redirect
redirect(request.path_info) # No query parameters
redirect(request.build_absolute_uri()) # Keeps query parameters
redirect(request.get_full_path()) # Keeps query parameters
【讨论】:
您提供的所有 3 个示例都是指请求 url(如/login/
),而不是当前页面的 url(例如 /
)。
链接的文档解释了这些方法的作用以及它的工作原理,如 django 文档中所述。【参考方案3】:
100% 工作示例
对于基于类的视图和函数:
from django.http import HttpResponseRedirect
...
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
或
from django.http import HttpResponseRedirect
...
return HttpResponseRedirect(self.request.META.get('HTTP_REFERER'))
示例 -
class TaskNotificationReadAllView(generic.View):
def get(self, request, *args, **kwargs):
TaskNotification.objects.filter(assigned_to=request.user).update(read=True)
print(request.META.get('HTTP_REFERER'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
【讨论】:
【参考方案4】:在 django 视图中,假设您没有登录,但点击了一些内容触发某些 url 的内容,例如 /board/2/new_topic 然后@login_required 会将您重定向到使用此 url 的登录页面
http://localhost:8000/signin/?next=/boards/2/new_topic/
所以我们的目标是在成功登录后重定向到 http://localhost:8000/boards/2/new_topic/ 页面,所以我们必须添加一行
if 'next' in request.GET:
return redirect(request.GET['next'])
如果它下一个存在,那么它将根据其他正常重定向进行重定向。
Views.py:
def signin(request):
if request.method == "POST":
user_login_form = UserLoginForm(request.POST)
email = request.POST['email']
password = request.POST['password']
user = authenticate(request, email=email, password=password)
if user and user.is_active:
login(request, user)
if 'next' in request.GET:
return redirect(request.GET['next'])
else:
return redirect('home')
else:
return render(request, 'signin.html', context='form': user_login_form)
else:
user_login_form = UserLoginForm()
return render(request, 'signin.html', context='form': user_login_form)
【讨论】:
以上是关于重定向/返回到Django中的相同(上一个)页面?的主要内容,如果未能解决你的问题,请参考以下文章