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

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

方法我知道:

  • HTTP _ REFERER
  • 包含前一个 URL 的 GET 参数
  • 存储以前 URL 的会话数据

还有别的吗?

75283 次浏览

其中一种方法是使用 HTTP_REFERER头文件,如下所示:

from django.http import HttpResponseRedirect


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

不知道这个的弊端!

虽然这个问题和答案已经过时了,但是我认为它缺少一些选择。我没有发现任何与方法的弊端,我会很高兴地知道,如果有任何?

  • Path _ info
  • Get _ full _ path ()
  • Build _ final _ 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
    

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

在 django 视图中,假设您没有登录,但是单击某些内容触发一些 URL,比如/board/2/new _ subject,然后@login _ need 会将您重定向到带有此 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'])

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

视图:

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