Django: сохранение ModelForm с помощью пользовательских моделей «многие ко многим» - PullRequest
3 голосов
/ 26 октября 2010

У меня есть Publication с и Author с. Так как порядок Author s имеет значение (профессор не хочет быть в списке после стажера, предоставившего некоторые тривиальные данные), я определил собственную модель «многие ко многим»:

class Authorship(models.Model):
    author = models.ForeignKey("Author")
    publication = models.ForeignKey("Publication")
    ordering = models.IntegerField(default=0)

class Author(models.Model):
    name = models.CharField(max_length=100)

class Publication(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author, through=Authorship)

У меня есть ModelForm для публикаций и использую его в виде. Проблема в том, что когда я звоню form.save(), авторы, очевидно, добавляются с порядком по умолчанию 0. Я написал OrderedModelMultipleChoiceField с помощью метода clean, который возвращает объекты, которые будут сохранены в правильном порядке, но я не нашел ловушку, в которой фактически сохраняются данные m2m, чтобы я мог добавить / редактировать / удалите Authorship экземпляры самостоятельно.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 26 октября 2010

Если вы используете пользовательскую таблицу M2M с параметром through, я считаю, что вы должны сделать сохранения вручную, чтобы сохранить дополнительные поля. Таким образом, по вашему мнению, вы бы добавили:

...
publication = form.save()
#assuming that these records are in order! They may not be
order_idx = 0
for author in request.POST.getlist('authors'): 
    authorship = Authorship(author=author, publication=publication, ordering=order_idx)
    authorship.save()
    order_idx += 1

Вы также можете поместить это в функцию save вашей ModelForm.

1 голос
/ 26 октября 2010

Я не уверен, что для этого есть хук, но вы можете сохранить его вручную, например:

form = PublicationForm(...)
pub = form.save(commit=False)
pub.save()
form.save_m2m()

Так что вы можете обрабатывать любые пользовательские действия между ними по мере необходимости. См. Примеры в документации для метода сохранения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...