Spec-Zone.ru › Wagtail 3

Настройки сайта

Вы можете определить настройки сайта, которые могут редактироваться администраторами в административной панели Wagtail. Эти настройки можно получить в коде, а также в шаблонах.

Для использования этих настроек необходимо добавить wagtail.contrib.settings в ваш INSTALLED_APPS:

INSTALLED_APPS += [
    'wagtail.contrib.settings',
]

Определение настроек

Создайте модель, которая наследуется от BaseSetting, и зарегистрируйте её с помощью декоратора register_setting:

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

@register_setting
class SocialMediaSettings(BaseSetting):
    facebook = models.URLField(
        help_text='Your Facebook page URL')
    instagram = models.CharField(
        max_length=255, help_text='Your Instagram username, without the @')
    trip_advisor = models.URLField(
        help_text='Your Trip Advisor page URL')
    youtube = models.URLField(
        help_text='Your YouTube channel or user account URL')

Ссылка «Настройки социальных сетей» появится в меню «Настройки» административной панели Wagtail.

Обработчики редактирования

Настройки используют обработчики редактирования, как и остальная часть Wagtail. Добавьте настройку panels в вашу модель, определяющую все необходимые обработчики редактирования:

@register_setting
class ImportantPages(BaseSetting):
    donate_page = models.ForeignKey(
        'wagtailcore.Page', null=True, on_delete=models.SET_NULL, related_name='+')
    sign_up_page = models.ForeignKey(
        'wagtailcore.Page', null=True, on_delete=models.SET_NULL, related_name='+')

    panels = [
        FieldPanel('donate_page'),
        FieldPanel('sign_up_page'),
    ]

Вы также можете настроить обработчики редактирования так же, как это делается для модели страницы с помощью пользовательского атрибута edit_handler:

from wagtail.admin.panels import TabbedInterface, ObjectList

@register_setting
class MySettings(BaseSetting):
    # ...
    first_tab_panels = [
        FieldPanel('field_1'),
    ]
    second_tab_panels = [
        FieldPanel('field_2'),
    ]

    edit_handler = TabbedInterface([
        ObjectList(first_tab_panels, heading='First tab'),
        ObjectList(second_tab_panels, heading='Second tab'),
    ])

Внешний вид

Вы можете изменить метку, используемую в меню, изменив verbose_name вашей модели.

Вы можете добавить иконку в меню, передав аргумент «icon» декоратору register_setting:

@register_setting(icon='placeholder')
class SocialMediaSettings(BaseSetting):
    class Meta:
        verbose_name = 'social media accounts'
    ...

Список всех доступных иконок см. в руководстве по стилю пользовательского интерфейса.

Использование настроек

Настройки предназначены для использования как в Python-коде, так и в шаблонах.

Использование в Python

Если вам нужен доступ к настройке в представлении, метод for_request() позволяет получить соответствующие настройки для текущего запроса:

def view(request):
    social_media_settings = SocialMediaSettings.for_request(request)
    ...

В местах, где запрос недоступен, но вы знаете Site, для которого хотите получить настройки, вы можете использовать for_site() вместо этого:

social_media_settings =  SocialMediaSettings.for_site(user.origin_site)

Использование в шаблонах Django

Добавьте обработчик контекста settings в свои настройки:

TEMPLATES = [
    {
        ...

        'OPTIONS': {
            'context_processors': [
                ...

                'wagtail.contrib.settings.context_processors.settings',
            ]
        }
    }
]

Затем получите доступ к настройкам через {{ settings }}:

{{ settings.app_label.SocialMediaSettings.instagram }}

Примечание

Замените app_label на имя приложения, содержащего вашу модель настроек.

Если вы не в RequestContext, тогда обработчики контекста не будут выполнены, и переменная settings не будет доступна. Для получения settings, используйте предоставленную метку шаблона {% get_settings %}. Если request находится в контексте шаблона, но по какой-то причине это не RequestContext, просто используйте {% get_settings %}:

{% load wagtailsettings_tags %}
{% get_settings %}
{{ settings.app_label.SocialMediaSettings.instagram }}

Если request вообще недоступно в шаблоне, вы можете использовать настройки для сайта по умолчанию Wagtail:

{% load wagtailsettings_tags %}
{% get_settings use_default_site=True %}
{{ settings.app_label.SocialMediaSettings.instagram }}

Примечание

Вы не можете надёжно получить правильный экземпляр настроек для текущего сайта из этой метки шаблона, если объект запроса недоступен. Это актуально только для многосайтовых установок Wagtail.

По умолчанию метка создаст или обновит переменную settings в контексте. Если вы хотите назначить вместо этого другую переменную контекста, используйте {% get_settings as other_variable_name %}:

{% load wagtailsettings_tags %}
{% get_settings as wagtail_settings %}
{{ wagtail_settings.app_label.SocialMediaSettings.instagram }}

Использование в шаблонах Jinja2

Добавьте расширение wagtail.contrib.settings.jinja2tags.settings в ваши настройки Jinja2:

TEMPLATES = [
    # ...
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'APP_DIRS': True,
        'OPTIONS': {
            'extensions': [
                # ...
                'wagtail.contrib.settings.jinja2tags.settings',
            ],
        },
    }
]

Затем получите доступ к настройкам через функцию шаблона settings():

{{ settings("app_label.SocialMediaSettings").twitter }}

Примечание

Замените app_label на имя приложения, содержащего вашу модель настроек.

Это будет искать переменную request в контексте шаблона и найти правильный сайт для использования. Если по какой-то причине у вас нет request , вы можете вместо этого использовать настройки, определённые для сайта по умолчанию:

{{ settings("app_label.SocialMediaSettings", use_default_site=True).instagram }}

Вы можете сохранить экземпляр настроек в переменной, чтобы сэкономить на наборе, если вам нужно использовать несколько значений из одной модели:

{% with social_settings=settings("app_label.SocialMediaSettings") %}
    Follow us on Twitter at @{{ social_settings.twitter }},
    or Instagram at @{{ social_settings.instagram }}.
{% endwith %}

Или, альтернативно, используя метку set:

{% set social_settings=settings("app_label.SocialMediaSettings") %}

Использование select_related для повышения эффективности

Для моделей с отношениями внешнего ключа к другим объектам (например, страницам), которые очень часто необходимы для вывода значений в шаблонах, вы можете установить атрибут select_related в вашей модели, чтобы Wagtail использовал метод Django QuerySet.select_related() для извлечения объекта настроек и связанных объектов в одном запросе. В результате начальный запрос становится более сложным, но вы сможете свободно получать значения внешних ключей без дополнительных запросов, что в целом повысит эффективность.

Развивая пример ImportantPages из предыдущего раздела, следующее показывает, как select_related можно установить для повышения эффективности:

@register_setting
class ImportantPages(BaseSetting):

    # Fetch these pages when looking up ImportantPages for or a site
    select_related = ["donate_page", "sign_up_page"]

    donate_page = models.ForeignKey(
        'wagtailcore.Page', null=True, on_delete=models.SET_NULL, related_name='+')
    sign_up_page = models.ForeignKey(
        'wagtailcore.Page', null=True, on_delete=models.SET_NULL, related_name='+')

    panels = [
        FieldPanel('donate_page'),
        FieldPanel('sign_up_page'),
    ]

С этими добавленными данными следующий код шаблона теперь вызовет один запрос к базе данных вместо трёх (один для получения настроек и два для получения каждой страницы):

{% load wagtailcore_tags %}
{% pageurl settings.app_label.ImportantPages.donate_page %}
{% pageurl settings.app_label.ImportantPages.sign_up_page %}

Использование сокращения настроек page_url

Если, как и в предыдущем разделе, ваша модель настроек ссылается на страницы, и вам часто нужно выводить URL-адреса этих страниц в своём проекте, вы, вероятно, можете использовать сокращение page_url модели настроек для этого более чётко. Например, вместо этого:

{% load wagtailcore_tags %}
{% pageurl settings.app_label.ImportantPages.donate_page %}
{% pageurl settings.app_label.ImportantPages.sign_up_page %}

Вы можете написать:

{{ settings.app_label.ImportantPages.page_url.donate_page }}
{{ settings.app_label.ImportantPages.page_url.sign_up_page }}

Использование сокращения page_url имеет несколько преимуществ перед использованием метки:

  1. Страница «specific» автоматически извлекается для генерации URL-адреса, поэтому вам не нужно беспокоиться об этом (или забывать об этом) самостоятельно.
  2. Результаты кэшируются, поэтому, если вам нужно получить один и тот же URL-адрес страницы в нескольких местах (например, в форме и в навигации футера), использование сокращения page_url будет более эффективным.
  3. Это более кратко, и синтаксис одинаков как в шаблонах, так и в представлениях (или другом Python-коде), что позволяет вам писать более согласованный код.

При использовании сокращения page_url стоит отметить несколько моментов:

  1. Те же ограничения, которые применяются к метке {% pageurl %} , применяются и к сокращению: Если к настройкам обращаются из контекста шаблона, где текущий запрос недоступен, все возвращаемые URL-адреса будут включать схему/домен сайта, а генерация URL-адресов не будет такой эффективной.
  2. Если использовать сокращение в представлениях или другом Python-коде, метод вызовет AttributeError , если запрашиваемый вами атрибут от page_url не является атрибутом объекта настроек.
  3. Если объект настроек ИМЕЕТ атрибут, но атрибут возвращает значение None (или что-то, что не является Page ), сокращение вернёт пустую строку.

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v3.0.3/reference/contrib/settings.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API