重定向/返回到Django中的同一(上一)页?

重定向/返回到Django中的同一(上一)页?,django,django-views,Django,Django Views,在Django中,当您想将用户返回到同一页面时,有哪些选项?每个选项的优缺点是什么 我知道的方法: HTTP\u参考 获取包含上一个URL的参数 用于存储上一个URL的会话数据 还有其他方法吗?其中一种方法是使用HTTP\u REFERER标题,如下所示: from django.http import HttpResponseRedirect def someview(request): ... return HttpResponseRedirect(request.META

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

我知道的方法:

  • HTTP\u参考
  • 获取包含上一个URL的参数
  • 用于存储上一个URL的会话数据

还有其他方法吗?

其中一种方法是使用
HTTP\u REFERER
标题,如下所示:

from django.http import HttpResponseRedirect

def someview(request):
   ...
   return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

我不确定这有什么坏处

虽然问题和答案很古老,但我认为它缺少一些选择。我没有发现任何与方法的缺点,我很高兴知道是否有任何

100%工作示例

对于基于类的视图和函数:

from django.http import HttpResponseRedirect
    ...
    return HttpResponseRedirect(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'))

在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})

我认为最大的缺点是很多用户/浏览器都关闭了http_referer。你知道关闭标头有多困难吗?大多数用户不知道它是什么,更不用说如何关闭它了。在Firefox和Chrome中,您必须手动编辑首选项(同样,没有多少人知道如何进行编辑);在IE中,您根本无法禁用它(对于安全站点,它会自动禁用)。我认为,如果未设置request.META,则最好重定向到站点主页:return HttpResponseRedirect(request.META.get('HTTP_REFERER','/'))另一个缺点是,如果在提交过程中验证失败,用户必须更正一些文件并重新提交,然后HTTP_REFERER将成为表单的url。如果您还想保留滚动位置,请参阅答案。链接上显示“登录后”。我问过“登录后”吗?这个问题可以是这个主题的真实概述。它不应该得到-1,它应该得到+1。Jeeez相反,逻辑与get或post没有什么不同,它只是一个重定向问题。在你定义一些推理之前,没有赞成和反对的因素。你的问题很广泛,没有适当的研究或试验。这是非常不同的。Django登录和注释重定向是内置的。我的问题是关于其他情况;)这绝对不是建议的bug的副本。“复制”是重定向到登录页面后的重定向,这通常是重定向回引用页面(考虑从详细信息或编辑页面返回到列表页面)。请删除无效的重复标志。+1用于删除重复禁令。这个问题在谷歌这个搜索词中排名第一,只有一个答案,但有多种(更好的?)方法可以解决这个问题。并且它与登录情况无关。您提供的所有3个示例都是指请求url(如
/login/
),而不是当前页面的url(如
/
)。链接文档说明了这些方法的作用,其工作原理如django文档中所述。
  if 'next' in request.GET:
        return redirect(request.GET['next'])
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})