как сохранить многие поля в представлении создания django

Вот мои модели:

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)

Теперь проблема: я не могу заставить его работать, чтобы сохранить поле «многие ко многим», используя общее представление создания.

Невозможно задать значения для ManyToManyField, указывающего промежуточную модель. Вместо этого используйте менеджер posts.CatToPost.

В SO была аналогичная проблема, которая предлагала переопределить метод 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)

Ошибка:

Невозможно назначить "": Экземпляр "Post" не сохраняется в базе данных.

Кажется, self.object = form.save(commit=False) не сохраняется в БД, поэтому идентификатор сообщения не был создан.

Но когда я поворачиваю self.object = form.save(commit=True) , у меня снова возникает предыдущая ошибка.

Любая идея, как я могу преодолеть эту проблему?


person dev-jim    schedule 14.07.2015    source источник


Ответы (1)


У меня также была аналогичная проблема с ответом, который вы указали. Для меня сработало добавление self.object.save() после self.object = form.save(commit=False)

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)
person Scott Staniewicz    schedule 06.04.2017