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

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

不需要依赖浏览器配置,适用所有场景:

  1. 首先在跳转到编辑页的入口链接里带上当前页地址作为next参数,比如列表页的编辑按钮链接:
<a href="{% url '你的编辑页路由名' object.pk %}?next={{ request.path }}">编辑记录</a>
  1. 在编辑页的form表单里添加隐藏的next字段:
<form method="post">
    {% csrf_token %}
    <input type="hidden" name="next" value="{{ request.GET.next }}">
    <!-- 其余表单字段 -->
    <button type="submit">保存</button>
</form>
  1. 视图里直接从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 07:09:03