如何在 Wagtail Admin 中添加多对多字段?

Mar*_*lle 1 django wagtail

我正在尝试为包含在每个页面上的 Wagtail 站点设置页脚,但我想包含一个链接列表(电话、电子邮件、社交媒体)。如果我在没有 的情况下尝试下面的代码,panel = [...]我可以看到它的工作原理,但我无法添加任何项目:

在此处输入图片说明

from wagtail.contrib.settings.models import BaseSetting, register_setting
from django import forms

class ContactInfo(models.Model):
    CONTACT_CHOICES = (
        ('fas fa-phone', 'Phone'),
        ('fas fa-envelope', 'Email'),
        ('fab fa-facebook-f', 'Facebook'),
        ('fa-instagram', 'Instagram'),
        ('fab fa-linkedin', 'LinkedIn'),
        ('fab fa-twitter', 'Twitter'),
        ('fab fa-pinterest', 'Pinterest'),
        ('fab fa-github', 'GitHub'),
        ('fab fa-gitlab', 'GitLab'),
    )

    contact_type = models.CharField(choices=CONTACT_CHOICES, max_length=50)
    contact_info = models.CharField(max_length=50)
    info_prefix = models.CharField(max_length=10, editable=False)

    def save(self, *args, **kwargs):
        if self.contact_type == 'Phone':
            self.info_prefix = 'tel:'
        elif self.contact_type == 'Email':
            self.info_prefix = 'mailto:'
        else:
            self.info_prefix = ''


@register_setting
class Contact(BaseSetting):
    contact = models.ManyToManyField(ContactInfo)

    panels = [
        FieldPanel('contact', widget=forms.CheckboxSelectMultiple)
    ]
Run Code Online (Sandbox Code Playgroud)

是否可以向 M2M 字段添加项目?有没有办法在 Wagtail 设置中制作项目列表?有没有更简单的方法来制作在每个页面上自动呈现的页脚?

gas*_*man 5

每个ContactInfo项目(大概)都属于一个Contact,因此这是一对多关系而不是多对多关系。(在这种情况下,多对多关系意味着您有一个ContactInfo先前通过其他视图定义的共享项目池,并且您正在选择要附加到当前Contact. 的项目。)

在 Wagtail 中,这将使用ParentalKeyon定义ContactInfo以指向相应的Contact,并使用InlinePanel. (有关示例,请参阅Wagtail 教程中的图库图像示例。)

from django.db import models
from wagtail.admin.edit_handlers import FieldPanel, InlinePanel
from wagtail.core.models import Orderable
from wagtail.contrib.settings.models import BaseSetting, register_setting
from modelcluster.fields import ParentalKey
from modelcluster.models import ClusterableModel

class ContactInfo(Orderable):
    CONTACT_CHOICES = (
        # ...
    )

    contact = ParentalKey('Contact', on_delete=models.CASCADE, related_name='contact_links')
    contact_type = models.CharField(choices=CONTACT_CHOICES, max_length=50)
    contact_info = models.CharField(max_length=50)
    # info_prefix handling omitted here for brevity

    panels = [
        FieldPanel('contact_type'),
        FieldPanel('contact_info'),
    ]


@register_setting
class Contact(BaseSetting, ClusterableModel):
    panels = [
        InlinePanel('contact_links', label="Contact")
    ]
Run Code Online (Sandbox Code Playgroud)

  • 我只是有机会尝试一下,如果我将 Contact 模型更改为:class Contact(BaseSetting, ClusterableModel),它会起作用: (2认同)