ag抽象图像,ParentalManyToManyField和ClusterableModel

时间:2018-08-07 12:17:35

标签: python django python-3.x wagtail

使用wagtail 2.1,django 2.0.3,python 3.6.4

我有以下(简化的)自定义图像模型,它们通过m2m关系链接到PhotoTypePhotoPlate

from wagtail.images.models import AbstractImage
from modelcluster.fields import ParentalManyToManyField
from modelcluster.models import ClusterableModel

class PhotoType(models.Model):
    title = models.CharField(verbose_name='Title', max_length=255, blank=False, null=False, default=None)

class PhotoPlate(models.Model):
    plate= models.CharField(verbose_name='Title', max_length=255, blank=False, null=False, default=None)

class Photo(AbstractImage):
    type = ParentalManyToManyField(PhotoType, help_text="Several are allowed.", blank=True)
    plate = ParentalManyToManyField(PhotoPlate, help_text="Several are allowed.", blank=True)

    class Meta:
        verbose_name = 'Photo'
        verbose_name_plural = 'Photos'

PhotoTypePhotoPlate模型是通过本地modeladmin_register(PhotoTypeModelAdmin)文件中的modeladmin_register(PhotoPlateModelAdmin)wagtail_hooks.py引用的。

遵循documentation后,一切正常。

除了一件事:在为两个字段typeplate呈现的多项选择下拉列表中,无论选择了多少项,都永远不会保存对应的m2m关系。 我找到了几个answers,但是可以通过玩Photo类的继承来使其工作,例如:class CCAPhoto(ClusterableModel, AbstractImage)

是否可以将ParentalManyToManyField添加到自定义图像模型中?如果是这样,我想念什么?

编辑: 手动将关系添加到数据库时,正确的项目会正确显示在wagtail管理表单上--即在初始加载时预先选择。

1 个答案:

答案 0 :(得分:3)

您应该在此处使用普通的ParentalManyToManyField,而不是使用ManyToManyField

class Photo(AbstractImage):
    type = models.ManyToManyField(PhotoType, help_text="Several are allowed.", blank=True)
    plate = models.ManyToManyField(PhotoPlate, help_text="Several are allowed.", blank=True)

ParentalManyToManyFieldParentalKey字段类型设计用于Wagtail的页面编辑器(以及相关的片段,如代码片段),在其中,多个模型需要一起作为一个单元进行预览和版本控制。跟踪。 Wagtail的图像和文档模型不使用此模型-它们由通过普通Django ModelForm编辑的单个模型组成,因此ParentalManyToManyFieldParentalKey是不必要的。