使用 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 管理表单上 - 即,在初始加载时预先选择。

最佳答案

而不是使用 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 不是必需的。

关于python - wagtail AbstractImage、ParentalManyToManyField 和 ClusterableModel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51726614/

10-12 20:09