【问题标题】:Django CreateView gives an error "needs to have a value for field "..." before this many-to-many relationship can be used."Django CreateView 给出了一个错误“需要为字段“...”设置一个值,然后才能使用这种多对多关系。”
【发布时间】:2013-07-26 03:28:28
【问题描述】:

我正在练习使用 Django 的 FormViews。

在这个应用程序中,我正在创建一个用于创建博客文章的 PostCreate 视图。

这是我的代码:

models.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)

forms.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 方法中......但我不知道应该在哪里实现......

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

【问题讨论】:

    标签: python django django-class-based-views


    【解决方案1】:

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

    【讨论】:

    • 您的建议解决了错误!!但是,在这样做之后,出于某种原因,为每个帖子添加了 Tag 对象....例如,如果我将 Tag1 添加到 Post#4,Tag1 将添加到 Post#1、Post#2、Post#3 和 Post #4 .. 想知道为什么会这样... :(
    • 是的。提示真的很有帮助。顺便说一句,有时我认为好的错误消息是绿色的。糟糕的(令人困惑的)错误消息(比如这个)需要考虑到谷歌来询问(也需要回答)。如果提问者不知道接受正确答案,可能会更糟;-)
    【解决方案2】:

    您应该在分配用户后保存您的对象,然后使用 m2m 关系进行操作:

    self.object = form.save(commit=False)  # Not saved to database.
    self.object.user = self.request.user
    self.object.save()  # Saved.
    
    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多