You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用HttpResponseRedirect跳转时post新增context值无法正常渲染问题

问题根本原因

你使用的HttpResponseRedirect是重定向响应,它的作用是让浏览器发起一个全新的GET请求到指定路径,你传入的context参数不会被传递到新的请求中:Django的HttpResponseRedirect构造函数根本不接收context作为入参,你写入context的所有动态内容都会在重定向后丢失。模板里能拿到的只有重定向后新的GET请求通过get_context_data生成的context内容,所以你在post里新增的字段自然无法渲染。


解决方案

方案1:不需要防止表单重复提交时,直接渲染页面

不需要跳转,表单处理完成后直接把带动态内容的context传给模板渲染即可,示例代码如下:

def post(self, request, *args, **kwargs):
    RoomBookingsForm = BookRoomsForm(request.POST or None)
    self.object = self.get_object()
    context = self.get_context_data(*args, **kwargs)
    
    # 表单验证、业务逻辑处理
    if RoomBookingsForm.is_valid():
        RoomBookingsForm.save()
    
    # 把动态生成的queryset写入context
    context['room_type_queryset'] = RoomType.objects.all()
    # 直接渲染当前模板,context会直接传给模板
    return render(request, self.template_name, context)

方案2:需要防止表单重复提交,必须用重定向时,通过session/URL参数传递状态

如果要避免用户刷新页面重复提交表单,必须用重定向的话,可以把需要传递的参数存在session或者URL查询参数里,在GET请求的get_context_data中取出参数生成动态queryset:

  1. post方法中存参数:
def post(self, request, *args, **kwargs):
    RoomBookingsForm = BookRoomsForm(request.POST or None)
    if RoomBookingsForm.is_valid():
        # 业务逻辑处理
        RoomBookingsForm.save()
        # 把生成queryset需要的参数存在session中,不要直接存queryset
        request.session['room_filter_params'] = request.POST.dict()
    return HttpResponseRedirect(self.request.path_info)
  1. 重写get_context_data取参数生成queryset:
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    # 取出session中的参数,取出后自动删除session避免重复显示
    filter_params = self.request.session.pop('room_filter_params', None)
    if filter_params:
        # 根据提交的参数生成动态queryset
        context['room_type_queryset'] = RoomType.objects.filter(**你的过滤条件)
    else:
        # 默认展示的queryset
        context['room_type_queryset'] = RoomType.objects.all()
    return context

内容的提问来源于stack exchange,提问作者Ross Symonds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:45:07