django - wagtail 页面模型与自身的多对多关系?

标签 django django-models django-admin wagtail wagtail-admin

所以我得到了一个带有“伴侣”字段的 PlantDetailPage 模型(是的,植物可以是伴侣),我应该可以在其中选择其他 PlantDetailPages。我得到了要显示的内容,以内联方式创建新植物(是的,菜单中的菜单...),但几乎没有问题:

1) 它只是不会选择它们(点击“选择植物详细页面”时没有任何 Action )

2) “伙伴”菜单按钮现在显示在左侧(就像它变成的一个片段?)——我想避免这种情况。

3) 我不知道如何将配套的内联选择器限制为只选择而不创建更多的 PlantDetailPages(这样就没有窗口的递归)?

这是 models.py 中的模型:

class PlantCompanion(ClusterableModel):
    companion = models.ForeignKey(
        "vegependium.PlantDetailPage", on_delete=models.SET_NULL, related_name="plants", null=True
    )
    plant = ParentalKey(
        "vegependium.PlantDetailPage",
        on_delete=models.SET_NULL,
        related_name="companions",
        null=True,
    )
    panels = [InstanceSelectorPanel("companion")]
class PlantDetailPage(Page):
    genus_species = models.CharField(max_length=100, blank=False, null=False)
    # soo many other fields
    content_panels = Page.content_panels + [
        #soo many other panels
        FieldPanel("alternative_names")
                ],
            heading=_("names")
        ),
        MultiFieldPanel(heading=_("Companions"), children=[InlinePanel("companions")]),
        #even more panels
    ]
    def get_context(self, request):
        context = super().get_context(request)
        context["plant"] = self  # needed?
        # You always can access the page object via "page" or "self" in the template!
        return context

在 admin.py 中:

class CompanionAdmin(ModelAdmin):
    """Modeladmin definitions for sompanions."""
    model = PlantDetailPage
    menu_label = _("Companions")
    menu_icon = "snippet"
    menu_order = 499  # defines the menu position (e.g. after "images")
    add_to_settings_menu = False
    exclude_from_explorer = True
    list_filter = []  # list attributes with only few choices
    list_display = [
        "genus_species",
    ]  # columns to show up in admin (including one dynamic column)
    search_fields = ["genus_species"]  # columns to search in
modeladmin_register(CompanionAdmin)

最佳答案

from modelcluster.fields import ParentalManyToManyField

class PlantPage(Page):
    related_plants = ParentalManyToManyField('self', blank=True)

    content_panels = Page.content_panels + [
        FieldPanel('related_plants'),
    ]

这种关系是对称的,如果A与B相关,则B与A相关。

many to many self

文档 https://docs.wagtail.io/en/stable/getting_started/tutorial.html?highlight=ParentalManyToManyField 该示例使用复选框小部件。

FieldPanel('categories', widget=forms.CheckboxSelectMultiple),

关于django - wagtail 页面模型与自身的多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62399603/

相关文章:

Python Django 名称错误 : name 'model' is not defined

python - 将内联模型添加到 django 管理站点

python - Django Chartit 原始查询中不存在表

python - VirtualEnv apache2 服务器没有名为 'django' 的模块

Django ModelForm 不将数据保存到数据库

django - 访问模板内的foreignKey

python - ModelAdmin 中的 Django csrf_token

django管理面板在选择时无法设置有效的选择。

python - 在我尝试安装 pip install -r requirements.txt 文件后,Docker 构建出现错误

django - 导入错误 : cannot import name 'force_unicode' caused another exception