python - Django CreateView 给出错误 "needs to have a value for field ".. ."before this many-to-many relationship can be used."

标签 python django django-class-based-views

我正在练习 Django 的 FormViews。

在此应用中,我正在创建一个用于创建博客文章的 PostCreate View 。

这是我的代码:

模型.py

class Post(models.Model):
    user = models.ForeignKey(User)
    post_title = models.CharField(max_length=200)
    post_content = models.CharField(max_length=500)

class Tag(models.Model):
    name = models.CharField(max_length=64, unique=True)
    posts = models.ManyToManyField(Post)

表单.py

class PostForm(forms.ModelForm):
    post_title = forms.CharField(
        label=u'Title',
        widget=forms.TextInput(attrs={'size':64})
    )
    post_content = forms.CharField(
        label=u'Content',
        widget=forms.TextInput(attrs={'size':128})
    )
    tags = forms.CharField(
        label=u'Tags',
        required=True,
        widget=forms.TextInput(attrs={'size':64})
    )
    class Meta:
        model = Post
        exclude = ('user', 'post_date')

views.py

class PostCreate(CreateView):
    template_name = 'app_blog/post_save_form.html'
    model = Post
    form_class = PostForm

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user

        tag_names = form.cleaned_data['tags'].split()
        for tag_name in tag_names:
            tag, dummy = Tag.objects.get_or_create(name=tag_name)
            self.object.tag_set.add(tag)

        return super(PostCreate, self).form_valid(form)

当我尝试将帖子(测试帖子 1)保存到数据库中时,出现错误:

在可以使用这种多对多关系之前,字段“post”需要有一个值。

看起来问题是由 views.py 中的行引起的,我在其中拆分了“tag”字段并将标签添加到 post 对象的 tag_set 字段。我想这个逻辑不应该包含在 form_valid 方法中......但我不知道应该在哪里实现......

任何帮助将不胜感激:)谢谢

最佳答案

不,这不是问题所在。问题是您还没有保存 Post 对象,所以您不能与它创建多对多关系(因为在幕后,m2m 只是一个带有两个实体外键的链接表)。解决方法是先保存self.object

关于python - Django CreateView 给出错误 "needs to have a value for field ".. ."before this many-to-many relationship can be used.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17872441/

相关文章:

python - 使用 'https' 与 getpage() 获取 'urlopen' 页面

python - 如何对请求使用线程?

python - MultipleChoiceField - invalid_choice 错误 - 选择有效选项。 SomeChoice 不是可用选项之一

python - Django 类 View : __init__

python - 我应该为此使用基于类或基于函数的 View 吗?

python - 覆盖 __builtins__ 函数不适用于导入

python - Django StreamingHttpResponse 在用户完成下载后删除文件

python - Django 测试权限中的 ValueError

django:使用通用 View 类将额外参数传递给模板

python - 以 uuid 作为参数的 Django CBV