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

时间:2012-10-06 10:06:03

标签: django django-views

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

我知道的方法:

  • HTTP_REFERER
  • 包含先前网址的GET参数
  • 存储以前网址的会话数据

还有其他吗?

4 个答案:

答案 0 :(得分:99)

其中一种方法是使用HTTP_REFERER标题,如下所示:

from django.http import HttpResponseRedirect

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

不确定是否有这个缺点!

答案 1 :(得分:8)

虽然问题和答案都很陈旧,但我认为它缺少一些选择。我没有找到任何方法的缺点,我很乐意知道是否有?

答案 2 :(得分:0)

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'))

答案 3 :(得分:0)

在django视图中,假设您尚未登录,但单击某些内容会触发某些网址,例如/ board / 2 / new_topic,那么@login_required会将您重定向到使用该网址的登录页面

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