如何用Django CreateView保存表单?自定义form_valid后访问视图遇问题
问题分析与修复方案
你的代码存在一个关键问题:没有把用户创建的问题保存到数据库,导致操作后看不到新增的问题数据。
问题出在哪?
在form_valid方法里,你只给form.instance.user_id赋值了当前用户ID,然后直接返回重定向。但CreateView的form_valid默认逻辑是会调用form.save()来持久化数据的,你跳过了这一步,所以新创建的Question对象只在内存中存在,并没有写入数据库。
另外还有个小细节:redirect("oauth:profile", username=self.request.user)里的username参数应该传用户的用户名字符串,而不是User对象,直接传对象可能会导致URL解析错误。
修复后的代码
推荐两种写法,选一种即可:
写法一:调用父类方法完成保存(更符合CBV规范)
class QuestionCreate(LoginRequiredMixin, CreateView): model = Questions form_class = CreatePost def form_valid(self, form): # 直接赋值User对象比赋值id更直观,Django会自动处理外键关联 form.instance.user = self.request.user # 先让父类完成表单保存的逻辑 super().form_valid(form) # 自定义重定向到用户profile页面 return redirect("oauth:profile", username=self.request.user.username)
写法二:手动保存表单
class QuestionCreate(LoginRequiredMixin, CreateView): model = Questions form_class = CreatePost def form_valid(self, form): form.instance.user = self.request.user # 手动调用save保存数据到数据库 form.save() # 重定向到用户profile页面 return redirect("oauth:profile", username=self.request.user.username)
补充说明
- 直接使用
form.instance.user = self.request.user比user_id = self.request.user.id更优,Django的外键字段支持直接关联模型对象,代码更清晰,也能避免潜在的类型问题。 - 确保你的
CreatePost表单里没有暴露user字段(可以通过exclude或widgets设置为隐藏),防止用户手动修改这个值,破坏业务逻辑。
内容的提问来源于stack exchange,提问作者user2896120
相关产品推荐
相关产品推荐

