Django:使用自定义多对多模型保存ModelForm

时间:2010-10-26 17:15:51

标签: python django django-forms

我有PublicationAuthor s。由于Author的排序很重要(教授不想在实习生之后列出贡献一些琐碎的数据),我定义了一个自定义的多对多模型:< / p>

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 个答案:

答案 0 :(得分:2)

如果您使用through参数使用自定义M2M表,我相信您必须手动执行保存才能保存其他字段。因此,在您的视图中,您将添加:

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

您也可以将它放在ModelForm的save函数中。

答案 1 :(得分:1)

我不确定是否有这样的钩子,但您可以手动保存,例如:

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

因此,您可以根据需要处理其间的任何自定义操作。请参阅save method的文档中的示例。