代码之家  ›  专栏  ›  技术社区  ›  Benjamin Wohlwend

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

  •  3
  • Benjamin Wohlwend  · 技术社区  · 14 年前

    我有 Publication 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 回复  |  直到 14 年前
        1
  •  2
  •   Jordan Reiter    14 年前

    如果使用自定义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 功能。

        2
  •  1
  •   ars    14 年前

    我不确定这个是否有钩子,但你可以手动保存,比如:

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

    因此,您可以根据需要处理其间的任何自定义操作。有关 save method