在Django中,当您想要将用户返回到同一页面时,有哪些选项可用?它们各自的优缺点是什么?
我知道的方法有:
- HTTP_REFERER
- 包含先前URL的GET参数
- 使用会话数据存储先前的URL
还有其他方法吗?
在Django中,当您想要将用户返回到同一页面时,有哪些选项可用?它们各自的优缺点是什么?
我知道的方法有:
还有其他方法吗?
其中一种方法是使用类似下面的 HTTP_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'))
或者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'))
虽然这个问题和答案是老的,但我认为它缺少一些选项。我没有发现任何使用这种方法的缺点,如果有的话,我很乐意知道。
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
/login/
),而不是当前页面的URL(例如/
)。 - Adrien Lemaire 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})