在Django中使用CreateView保存非User类型外键(Group)问题
解决CreateView中Group外键无法保存的问题
我仔细扒了你的代码,发现两个核心问题导致Group外键没能正确保存:
1. form_valid方法中super调用的类名拼写错误
你的视图类名为CreatePostInGroup,但在form_valid的最后一行却写成了:
return super(CreatPostInGroup, self).form_valid(form)
这里少了一个字母e(Creat → Create),这会触发NameError,直接阻断表单的保存流程。哪怕你给user字段赋值成功了,这行错误代码也会让整个提交失败。
2. 依赖get方法给self.form_group赋值不安全
你在get方法里给self.form_group赋值,但如果用户直接发送POST请求(比如用API工具提交、或者跳过页面刷新直接提交表单),get方法根本不会执行,self.form_group就不存在,这时候try块会触发并返回404,Group字段自然没法赋值。
修正后的视图代码
针对以上问题,我调整了逻辑:去掉对get方法的依赖,直接在form_valid里获取Group对象,同时修正了类名拼写:
class CreatePostInGroup(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView): model = Post fields = ['title', 'post_text'] template_name = 'posts/post_in_group_form.html' def form_valid(self, form): # 直接赋值当前登录用户 form.instance.user = self.request.user # 从URL的slug参数中获取Group,确保GET/POST请求都能拿到 form.instance.group = get_object_or_404(Group, slug=self.kwargs.get('slug')) # 调用正确的父类方法完成保存 return super(CreatePostInGroup, self).form_valid(form) def get_context_data(self, *args, **kwargs): context = super(CreatePostInGroup, self).get_context_data(*args, **kwargs) context['group'] = get_object_or_404(Group, slug=self.kwargs.get('slug')) return context
额外调试小技巧
如果还是有问题,可以在form_valid里加几句打印,确认赋值是否成功:
def form_valid(self, form): form.instance.user = self.request.user form.instance.group = get_object_or_404(Group, slug=self.kwargs.get('slug')) # 打印检查赋值结果 print(f"User assigned: {form.instance.user}") print(f"Group assigned: {form.instance.group}") return super(CreatePostInGroup, self).form_valid(form)
看看控制台输出,确认两个外键都被正确赋值,再去数据库里查对应记录就行。
内容的提问来源于stack exchange,提问作者Alijah O'Connor
相关产品推荐
相关产品推荐

