如何在 Wagtail Admin 中添加多对多字段?
How can you add a many to many field in Wagtail Admin?
我正在尝试为包含在每个页面上的 Wagtail 网站设置页脚,但我想包含一个链接列表(phone、电子邮件、社交媒体)。如果我在没有 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)
]
是否有向 M2M 字段添加项目的方法?有没有办法在 Wagtail 设置中列出项目?有没有更简单的方法来制作在每个页面上自动呈现的页脚?
每个 ContactInfo
项(大概)属于单个 Contact
,因此这是一对多关系而不是多对多关系。 (在这种情况下,多对多关系意味着您有一个 ContactInfo
项目的共享池,这些项目以前是通过其他视图定义的,并且您正在选择将哪些项目附加到当前 Contact
.)
在 Wagtail 中,这将使用 ContactInfo
上的 ParentalKey
来定义以指向相应的 Contact
,并使用 InlinePanel
呈现。 (有关示例,请参阅 Wagtail 教程中的 gallery image 示例。)
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")
]
我正在尝试为包含在每个页面上的 Wagtail 网站设置页脚,但我想包含一个链接列表(phone、电子邮件、社交媒体)。如果我在没有 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)
]
是否有向 M2M 字段添加项目的方法?有没有办法在 Wagtail 设置中列出项目?有没有更简单的方法来制作在每个页面上自动呈现的页脚?
每个 ContactInfo
项(大概)属于单个 Contact
,因此这是一对多关系而不是多对多关系。 (在这种情况下,多对多关系意味着您有一个 ContactInfo
项目的共享池,这些项目以前是通过其他视图定义的,并且您正在选择将哪些项目附加到当前 Contact
.)
在 Wagtail 中,这将使用 ContactInfo
上的 ParentalKey
来定义以指向相应的 Contact
,并使用 InlinePanel
呈现。 (有关示例,请参阅 Wagtail 教程中的 gallery image 示例。)
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")
]