Spec-Zone.ru › Django 6.0

Приложение flatpages

Django включает необязательное приложение «flatpages». Оно позволяет хранить «плоский» HTML-контент в базе данных и управлять им через интерфейс администратора Django и API на Python.

Плоская страница — это объект с URL, заголовком и содержимым. Используйте её для отдельных страниц особого назначения, например страниц «О нас» или «Политика конфиденциальности», которые вы хотите хранить в базе данных, но для которых не хотите разрабатывать отдельное приложение Django.

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

Поле содержимого можно оставить пустым, если вы предпочитаете разместить содержимое в собственном шаблоне.

Установка

Чтобы установить приложение flatpages, выполните следующие действия:

  1. Установите sites framework, добавив 'django.contrib.sites' в настройку INSTALLED_APPS, если его там ещё нет.

    Также убедитесь, что для SITE_ID правильно задан идентификатор сайта, который представляет файл настроек. Обычно это 1 (то есть SITE_ID = 1), но если вы используете фреймворк sites для управления несколькими сайтами, это может быть идентификатор другого сайта.

  2. Добавьте 'django.contrib.flatpages' в настройку INSTALLED_APPS.

Затем выполните одно из следующих действий:

  1. Добавьте запись в свой URLconf. Например:

    urlpatterns = [
        path("pages/", include("django.contrib.flatpages.urls")),
    ]
    

или:

  1. Добавьте 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware' в настройку MIDDLEWARE.
  2. Выполните команду manage.py migrate.

Как это работает

manage.py migrate создаёт в базе данных две таблицы: django_flatpage и django_flatpage_sites. django_flatpage — это справочная таблица, которая сопоставляет URL с заголовком и текстовым содержимым. django_flatpage_sites связывает плоскую страницу с сайтом.

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

Есть несколько способов включить плоские страницы в URLconf. Можно выделить для них отдельный путь:

urlpatterns = [
    path("pages/", include("django.contrib.flatpages.urls")),
]

Также можно настроить шаблон «catchall». В этом случае важно поместить его в конец остальных шаблонов urlpatterns:

from django.contrib.flatpages import views

# Your other patterns here
urlpatterns += [
    re_path(r"^(?P<url>.*/)$", views.flatpage),
]

Предупреждение

Если для APPEND_SLASH задано значение False, необходимо убрать косую черту из шаблона catchall, иначе плоские страницы без завершающей косой черты не будут найдены.

Ещё один распространённый вариант — использовать плоские страницы для ограниченного набора известных страниц и явно указать их URL в URLconf:

from django.contrib.flatpages import views

urlpatterns += [
    path("about-us/", views.flatpage, kwargs={"url": "/about-us/"}, name="about"),
    path("license/", views.flatpage, kwargs={"url": "/license/"}, name="license"),
]

Аргумент kwargs задаёт значение url, используемое для поиска модели FlatPage в представлении плоской страницы.

Аргумент name позволяет выполнять обратное разрешение URL в шаблонах, например с помощью шаблонного тега url.

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

FlatpageFallbackMiddleware может выполнить всю необходимую работу.

class FlatpageFallbackMiddleware [исходный код]

Каждый раз, когда любое приложение Django выдаёт ошибку 404, это middleware в крайнем случае проверяет базу данных плоских страниц на наличие запрошенного URL. В частности, оно ищет плоскую страницу с заданным URL и идентификатором сайта, соответствующим настройке SITE_ID.

Если совпадение найдено, выполняется следующий алгоритм:

  • Если для плоской страницы задан собственный шаблон, загружается этот шаблон. В противном случае загружается шаблон flatpages/default.html.
  • В шаблон передаётся одна переменная контекста — flatpage, содержащая объект плоской страницы. Для рендеринга шаблона используется RequestContext.

Middleware добавит завершающую косую черту и выполнит перенаправление (с учётом настройки APPEND_SLASH) только в том случае, если полученный URL ведёт на существующую плоскую страницу. Перенаправления являются постоянными (код состояния 301).

Если совпадение не найдено, обработка запроса продолжается обычным образом.

Middleware активируется только при ошибках 404 — не при ошибках 500 и не при ответах с любым другим кодом состояния.

Для плоских страниц не применяется middleware представлений

Поскольку FlatpageFallbackMiddleware применяется только после неудачного разрешения URL, завершившегося ошибкой 404, в возвращаемом им ответе не будут применяться методы middleware представлений. Middleware представлений применяется только к запросам, которые успешно направлены к представлению посредством обычного разрешения URL.

Обратите внимание, что порядок элементов в MIDDLEWARE имеет значение. Обычно FlatpageFallbackMiddleware можно поместить в конец списка. Это означает, что при обработке ответа middleware запустится первым и позволит другим middleware, обрабатывающим ответы, увидеть настоящий ответ плоской страницы, а не ошибку 404.

Подробнее о middleware читайте в документации по middleware.

Убедитесь, что ваш шаблон 404 работает

Обратите внимание, что FlatpageFallbackMiddleware срабатывает только после того, как другое представление успешно вернуло ответ 404. Если другое представление или класс middleware пытается вернуть ошибку 404, но вместо этого вызывает исключение, ответом станет HTTP 500 («Внутренняя ошибка сервера»), и FlatpageFallbackMiddleware не станет пытаться отобразить плоскую страницу.

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

Предупреждение

Право добавлять или редактировать плоские страницы следует предоставлять только пользователям, которым вы доверяете. Плоские страницы задаются в виде необработанного HTML и Django их не очищает. В результате вредоносная плоская страница может привести к различным уязвимостям безопасности, включая повышение привилегий.

Через интерфейс администратора

Если вы активировали автоматический интерфейс администратора Django, на главной странице администратора должен отображаться раздел «Плоские страницы». Редактируйте плоские страницы так же, как и любые другие объекты в системе.

У модели FlatPage есть поле enable_comments, которое по умолчанию не используется приложением contrib.flatpages, но может быть полезно в вашем проекте или сторонних приложениях. Оно не отображается в интерфейсе администратора, но вы можете добавить его, зарегистрировав собственный ModelAdmin для FlatPage:

from django.contrib import admin
from django.contrib.flatpages.admin import FlatPageAdmin
from django.contrib.flatpages.models import FlatPage
from django.utils.translation import gettext_lazy as _


# Define a new FlatPageAdmin
class FlatPageAdmin(FlatPageAdmin):
    fieldsets = [
        (None, {"fields": ["url", "title", "content", "sites"]}),
        (
            _("Advanced options"),
            {
                "classes": ["collapse"],
                "fields": [
                    "enable_comments",
                    "registration_required",
                    "template_name",
                ],
            },
        ),
    ]


# Re-register FlatPageAdmin
admin.site.unregister(FlatPage)
admin.site.register(FlatPage, FlatPageAdmin)

Через API на Python

Плоские страницы представлены стандартной моделью Django FlatPage. Доступ к объектам плоских страниц можно получить через API базы данных Django.

Проверяйте URL плоских страниц на дубликаты.

Если вы добавляете или изменяете плоские страницы собственным кодом, вероятно, вам понадобится проверять, нет ли дублирующихся URL плоских страниц на одном сайте. Форма плоской страницы, используемая в интерфейсе администратора, выполняет такую проверку; её можно импортировать из django.contrib.flatpages.forms.FlatpageForm и использовать в собственных представлениях.

Модель FlatPage

class models.FlatPage

Поля

У объектов FlatPage есть следующие поля:

classmodels.FlatPage
url

Обязательное поле. Не более 100 символов. Индексируется для ускорения поиска.

title

Обязательное поле. Не более 200 символов.

content

Необязательное поле (blank=True). TextField, обычно содержащее HTML-контент страницы.

enable_comments

Логическое значение. По умолчанию это поле не используется приложением flatpages и не отображается в интерфейсе администратора. Подробное объяснение см. в разделе об интерфейсе администратора для плоских страниц.

template_name

Необязательное поле (blank=True). Не более 70 символов. Указывает шаблон, используемый для отображения страницы. Если значение не задано, используется flatpages/default.html.

sites

Связь «многие ко многим» с Site, определяющая, на каких сайтах доступна плоская страница.

Методы

classmodels.FlatPage
get_absolute_url()

Возвращает относительный путь URL страницы на основе атрибута url.

Шаблоны плоских страниц

По умолчанию плоские страницы отображаются с помощью шаблона flatpages/default.html, но для отдельной плоской страницы его можно переопределить: в интерфейсе администратора свёрнутая группа полей «Дополнительные параметры» (нажмите на неё, чтобы раскрыть) содержит поле для указания имени шаблона. Если вы создаёте плоскую страницу через API на Python, можно задать имя шаблона в поле template_name объекта FlatPage.

Создание шаблона flatpages/default.html — ваша задача; в каталоге шаблонов создайте каталог flatpages, содержащий файл default.html.

В шаблоны плоских страниц передаётся одна переменная контекста — flatpage, содержащая объект плоской страницы.

Вот пример шаблона flatpages/default.html:

<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>

Поскольку вы уже вводите необработанный HTML на странице администратора для плоской страницы, для flatpage.title и flatpage.content указано, что в шаблоне не требуется автоматическое экранирование HTML.

Получение списка объектов FlatPage в шаблонах

Приложение flatpages предоставляет шаблонный тег, позволяющий перебрать все доступные плоские страницы на текущем сайте.

Как и для всех пользовательских шаблонных тегов, перед использованием необходимо загрузить библиотеку пользовательских тегов. После загрузки библиотеки можно получить все плоские страницы текущего сайта с помощью тега get_flatpages:

{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
    {% for page in flatpages %}
        <li><a href="{{ page.url }}">{{ page.title }}</a></li>
    {% endfor %}
</ul>

Отображение плоских страниц registration_required

По умолчанию шаблонный тег get_flatpages отображает только плоские страницы, помеченные как registration_required = False. Чтобы отображать плоские страницы, доступные только после регистрации, необходимо указать аутентифицированного пользователя с помощью условия for.

Например:

{% get_flatpages for someuser as about_pages %}

Если передать анонимного пользователя, get_flatpages будет работать так же, как если бы пользователь не был указан, — то есть будет отображать только общедоступные плоские страницы.

Ограничение плоских страниц по базовому URL

Необязательный аргумент starts_with позволяет ограничить возвращаемые страницы теми, URL которых начинается с указанного базового URL. Этот аргумент можно передать в виде строки или переменной, значение которой будет получено из контекста.

Например:

{% get_flatpages '/about/' as about_pages %}
{% get_flatpages about_prefix as about_pages %}
{% get_flatpages '/about/' for someuser as about_pages %}

Интеграция с django.contrib.sitemaps

class FlatPageSitemap [исходный код]

Класс sitemaps.FlatPageSitemap проверяет все общедоступные flatpages, определённые для текущего значения SITE_ID (см. sites documentation), и создаёт запись в карте сайта. Эти записи содержат только атрибут location — без атрибутов lastmod, changefreq и priority.

Пример

Вот пример URLconf, использующего FlatPageSitemap:

from django.contrib.flatpages.sitemaps import FlatPageSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path

urlpatterns = [
    # ...
    # the sitemap
    path(
        "sitemap.xml",
        sitemap,
        {"sitemaps": {"flatpages": FlatPageSitemap}},
        name="django.contrib.sitemaps.views.sitemap",
    ),
]

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/contrib/flatpages/

Spec-Zone.ru

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