如何在Django类视图中实现创建tempfriend后返回上一页?
我来帮你解决这个问题!你遇到的核心问题有两个:一是在form_valid方法里引用请求对象的方式不对,二是表单保存的逻辑可以优化,而你提到用self.request却返回创建页面,大概率是因为之前没正确获取上一页的来源URL。
问题分析
- Request对象引用错误:在类视图的方法中,不能直接使用
request变量,必须通过self.request来访问当前请求对象,否则会抛出变量未定义的错误。 - 表单保存逻辑冗余:你现在先调用
form.save()把实例存到数据库,再设置belongs_to后再次保存,这样会触发两次数据库写入操作,完全可以优化成一次。 - 返回上一页的正确姿势:要返回上一页,必须通过
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
相关产品推荐
相关产品推荐

