【问题标题】:Redirect / return to same (previous) page in Django?重定向/返回到Django中的相同(上一个)页面?
【发布时间】:2012-09-27 08:23:36
【问题描述】:

当您想在 Django 中将用户返回到同一页面时,有哪些选项,每个选项的优缺点是什么?

我知道的方法:

  • HTTP_REFERER
  • GET 参数包含上一个 URL
  • 用于存储前一个 URL 的会话数据

还有其他的吗?

【问题讨论】:

  • 链接显示“登录后”。我是否问过“登录后”?这个问题可以是这个主题的真实概述。它不值得-1,它值得+1。哎呀
  • 相反,逻辑与 get 或 post 没有什么不同,它只是一个重定向问题,在您定义一些推理之前没有任何利弊,您的问题很广泛,没有适当的研究或试验.
  • 这是非常不同的。内置 Django 登录和 cmets 重定向。我的问题是针对其他情况的;)
  • 这绝对不是建议的错误的副本。 “重复”是重定向到登录页面后的重定向,这通常是返回到引用页面的重定向(考虑从详细信息或编辑页面返回到列表页面)。请删除无效的重复标志。
  • +1 用于删除重复禁令。这个问题在谷歌中是这个搜索词的第一名,只有一个答案,但会有多种(更好的?)方法来解决这个问题。它与登录情况无关。

标签: django django-views


【解决方案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】:

虽然问题和答案很旧,但我认为它缺少一些选项。我没有发现这些方法有任何缺点,我很乐意知道是否有任何缺点?

【讨论】:

  • 您提供的所有 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})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 2016-12-14
      相关资源
      最近更新 更多