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:
- 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)
- 重写
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
相关产品推荐
相关产品推荐

