django - 如何在django创建 View 中保存多对多字段

标签 django many-to-many django-generic-views

这是我的模型:

class Category(models.Model):
    name = models.CharField(max_length=255)
    slug = models.SlugField(unique=True, max_length=255, blank=True,default=None)
    desc = models.TextField(blank=True, null=True )
    .....

class Post(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    categories = models.ManyToManyField(Category, blank=True, through='CatToPost')
     .......

class CatToPost(models.Model):
    post = models.ForeignKey(Post)
    category = models.ForeignKey(Category)

现在的问题是我无法使用通用创建 View 来保存多对多字段。

Cannot set values on a ManyToManyField which specifies an intermediary model. Use posts.CatToPost's Manager instead.

在 SO 中,有一个类似的 problem 建议重写 form_valid 方法来手动创建关系,但它对我不起作用。

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

        for cat in form.cleaned_data['categories']:

            cate = CatToPost()
            cate.post = self.object
            cate.category = cat
            cate.save()
        return super(AddStoryForm, self).form_valid(form)

错误:

Cannot assign "": "Post" instance isn't saved in the database.

似乎 self.object = form.save(commit=False) 没有保存在数据库中,因此未创建帖子 ID。

但是当我打开 self.object = form.save(commit=True) 时,我仍然再次出现之前的错误。

知道如何克服这个问题吗?

最佳答案

我也遇到了与您列出的答案类似的问题。对我来说,有效的方法是在 self.object = form.save(commit=False)

之后添加 self.object.save()
def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.save()

    for cat in form.cleaned_data['categories']:

        cate = CatToPost()
        cate.post = self.object
        cate.category = cat
        cate.save()
    return super(AddStoryForm, self).form_valid(form)

关于django - 如何在django创建 View 中保存多对多字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31414091/

相关文章:

python - 获取最近几个小时内的元素

ruby-on-rails - Rails activerecord 正在查询 HABTM 关联中的错误列名

python - 权限混入 Django REST ListCreateAPIView

python - Django 通用 View : When to use ListView vs. DetailView

python - Django 模型继承和类型检查

django - 如何创建需要额外信息的复杂管理操作?

python - 保持 User.email 在 Django Admin 中唯一

django-admin - Django 管理员 : Many-to-Many listbox doesn't show up with a through parameter

java - jOOQ - 具有多对多关系的嵌套对象

django - 在 Django 基于类的通用 View 中访问上下文对象