我有 我有一个 有什么想法吗?Publication
和Author
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
个实例。
答案 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的文档中的示例。