Трясогузка: расширить страницу модели - PullRequest
0 голосов
/ 16 января 2020

Я создал в прошлом несколько страниц для трясогузки.

Пример:

class PlainPage(Page):
    body = StreamField(BasicStreamBlock, null=True, blank=True)

    content_panels = Page.content_panels + [
        StreamFieldPanel('body'),
    ]

Теперь я хотел бы расширить все эти страницы, дав им возможность установить их на no-index.

По этой причине я хотел бы добавить логическое поле к promo_panel.

Как лучше всего добавить эту функцию на все страницы, которые я уже создал?

no_index    = models.BooleanField(default=False)

promote_panels = Page.promote_panels + [
    FieldPanel('no_index'),
]

Каким будет правильный способ трясогузки, расширить все классы моей страницы этим кодом?

1 Ответ

2 голосов
/ 19 января 2020

Используя Django * Class Mixins , можно добавлять поля во все существующие модели без особых хлопот.

1. Создайте Mixin

Сначала - создайте новый CustomPageMixin (назовите его как хотите), который расширяет модель Page и имеет набор мета abstract=True.

class CustomPageMixin(Page):
    class Meta:
        abstract=True

    no_index = models.BooleanField(default=False)

    # adding to content_panels on other pages will need to use THIS promote_panels
    # e.g. promote_panels = CustomPageMixin.promote_panels + [...]
    promote_panels = Page.promote_panels + [
        FieldPanel('no_index'),
    ]

2 , Обновите ВСЕ существующие модели страниц

Обновите все используемые модели, чтобы использовать миксин, вместо того, чтобы расширять класс Page, они фактически расширят ваш миксин напрямую.

from ... import CustomPageMixin

class StandardPage(CustomPageMixin):
    #...

class HomePage(CustomPageMixin):
    #...

3. Run Migrations

Примечание. Это добавит поле no_index ко ВСЕМ страницам, которые теперь расширяют ваш новый миксин.

  • ./manage.py makemigrations
  • ./manage.py migrate

Потенциальные проблемы с этим подходом

  • Это может быть не лучшим способом сделать это, так как это немного косвенно и трудно понять на первый взгляд.
  • Это на самом деле не меняет поля модели страницы, поэтому оно будет доступно только при доступе к фактическому заданному c экземпляру модели через Page.specific
  • Это будет немного сложнее использовать это для специальных Page типов, таких как AbstractEmailForm.
...