Django提交POST请求后返回上一页的最佳实现方法(非登录场景)
核心错误原因
- 首次代码仅刷新页面:POST提交表单时的
HTTP_REFERER值是当前编辑页地址,所以跳转后等于刷新当前页,并不是你进入编辑页之前的上级页 - 第二次代码无法进入编辑页:你重写了
get方法直接返回重定向逻辑,GET请求访问编辑页时会直接跳转,根本不会加载编辑模板 - 第三次参数报错:Django的
UpdateView内置form_valid方法仅接收self和form两个参数,request对象可以直接通过self.request获取,不需要手动定义为入参
方案1:适配你当前环境的HTTP_REFERER用法
你需要在用户通过GET请求进入编辑页时,就把当时的上级页地址存到session里,表单提交后从session取地址跳转:
class pictures_update (LoginRequiredMixin, UserPassesTestMixin, UpdateView): model = pictures fields = ['name', 'date'] template_name = 'storiesapp/pictures.html' def get(self, request, *args, **kwargs): # 进入编辑页时存储上级页地址,避免POST请求时referer变为编辑页本身 request.session['prev_page'] = request.META.get('HTTP_REFERER', 'profile') return super().get(request, *args, **kwargs) def form_valid(self, form): form.instance.fk_user = self.request.user super().form_valid(form) # 取出存储的上级地址后从session删除,避免下次跳转复用旧地址 prev_url = self.request.session.pop('prev_page', 'profile') return HttpResponseRedirect(prev_url) def test_func(self): post = self.get_object() return self.request.user == post.fk_user
方案2:更稳定的next参数传递法(不依赖浏览器referer头)
不需要依赖浏览器配置,适用所有场景:
- 首先在跳转到编辑页的入口链接里带上当前页地址作为next参数,比如列表页的编辑按钮链接:
<a href="{% url '你的编辑页路由名' object.pk %}?next={{ request.path }}">编辑记录</a>
- 在编辑页的form表单里添加隐藏的next字段:
<form method="post"> {% csrf_token %} <input type="hidden" name="next" value="{{ request.GET.next }}"> <!-- 其余表单字段 --> <button type="submit">保存</button> </form>
- 视图里直接从POST参数取next地址跳转即可:
def form_valid(self, form): form.instance.fk_user = self.request.user super().form_valid(form) next_url = self.request.POST.get('next', 'profile') return redirect(next_url)
内容的提问来源于stack exchange,提问作者Game Analysis
相关产品推荐
相关产品推荐

