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

如何在Django类视图中实现创建tempfriend后返回上一页?

我来帮你解决这个问题!你遇到的核心问题有两个:一是在form_valid方法里引用请求对象的方式不对,二是表单保存的逻辑可以优化,而你提到用self.request却返回创建页面,大概率是因为之前没正确获取上一页的来源URL。

问题分析

  1. Request对象引用错误:在类视图的方法中,不能直接使用request变量,必须通过self.request来访问当前请求对象,否则会抛出变量未定义的错误。
  2. 表单保存逻辑冗余:你现在先调用form.save()把实例存到数据库,再设置belongs_to后再次保存,这样会触发两次数据库写入操作,完全可以优化成一次。
  3. 返回上一页的正确姿势:要返回上一页,必须通过self.request.META.get('HTTP_REFERER')获取来源URL,之前的代码里你用了未定义的request,导致逻辑失效。

修正后的完整代码

class tempfriend_create(FormView):
    form_class = forms.CreateTempfriendForm
    template_name = "tempfriends/create.html"
    
    def form_valid(self, form):
        # 先创建实例但不提交到数据库(commit=False)
        tempfriend = form.save(commit=False)
        # 为实例关联当前登录用户
        tempfriend.belongs_to = self.request.user
        # 一次性保存到数据库
        tempfriend.save()
        # 获取上一页URL,若不存在则默认跳转到首页
        referer_url = self.request.META.get('HTTP_REFERER', '/')
        return HttpResponseRedirect(referer_url)

额外优化建议

如果你的项目中经常需要实现"操作后返回上一页"的逻辑,可以封装一个复用的Mixin,让代码更简洁:

class RedirectBackMixin:
    def get_success_url(self):
        # 优先返回上一页,否则使用默认的success_url
        return self.request.META.get('HTTP_REFERER', super().get_success_url())

然后你的视图可以这样写:

class tempfriend_create(RedirectBackMixin, FormView):
    form_class = forms.CreateTempfriendForm
    template_name = "tempfriends/create.html"
    # 可以设置默认跳转地址,当HTTP_REFERER不存在时生效
    success_url = '/'
    
    def form_valid(self, form):
        tempfriend = form.save(commit=False)
        tempfriend.belongs_to = self.request.user
        tempfriend.save()
        return super().form_valid(form)

这种写法更符合Django的视图复用设计,也让逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:07:34