72

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

我知道的方法:

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

还有其他的吗?

4

4 回答 4

135

一种方法是使用HTTP_REFERER如下标头:

from django.http import HttpResponseRedirect

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

不确定这个的缺点!

于 2012-10-06T10:14:44.357 回答
20

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

于 2017-10-18T14:48:03.087 回答
20

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'))
于 2019-06-24T09:27:46.370 回答
3

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

然后如果它下一个在那里,那么它将根据其他正常重定向重定向。

视图.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})
于 2020-05-08T22:40:28.840 回答