Как добавить поле «многие ко многим» в Wagtail Admin? - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь установить нижний колонтитул для сайта Wagtail, который включен на каждую страницу, но я хочу включить список ссылок (телефон, электронная почта, социальные сети).Если я попробую приведенный ниже код без panel = [...], я вижу, что это работает, но я не могу добавить какие-либо элементы:

enter image description here

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?Есть ли способ сделать списки предметов в настройках трясогузки?Есть ли более простой способ создать нижний колонтитул, который автоматически отображается на каждой странице?

1 Ответ

0 голосов
/ 17 декабря 2018

Каждый элемент ContactInfo (предположительно) принадлежит одному Contact, так что это отношение «один ко многим», а не «многие ко многим».(Отношение «многие ко многим» в этом случае будет означать, что у вас есть общий пул ContactInfo элементов, ранее определенных через какое-либо другое представление, и вы выбираете, какие из них присоединить к текущему Contact.)

В Wagtail это будет определено с помощью ParentalKey на 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")
    ]
...