Приложение flatpages
Django поставляется с необязательным приложением «flatpages». Оно позволяет хранить «плоское» HTML-содержимое в базе данных и управляет им через административный интерфейс Django и Python-API.
Flatpage — это объект с URL, названием и содержимым. Используйте его для страниц с особым случаем, например, «О нас» или «Политика конфиденциальности», которые вы хотите хранить в базе данных, но для которых не хотите разрабатывать пользовательское приложение Django.
Flatpage может использовать пользовательский шаблон или системный по умолчанию. Он может быть связан с одним или несколькими сайтами.
Поле содержимого можно оставить пустым, если вы предпочитаете разместить содержимое в пользовательском шаблоне.
Установка
Чтобы установить приложение flatpages, выполните следующие действия:
-
Установите приложение
sites framework, добавив'django.contrib.sites'в настройкиINSTALLED_APPS, если это не сделано.Также убедитесь, что вы правильно установили
SITE_IDна идентификатор сайта, который представляют настройки. Обычно это1(т.е.SITE_ID = 1, но если вы используете фреймворк сайтов для управления несколькими сайтами, это может быть идентификатор другого сайта). - Добавьте
'django.contrib.flatpages'в настройкиINSTALLED_APPS.
Затем:
-
Добавьте запись в ваш файл URLconf. Например:
urlpatterns = [ path('pages/', include('django.contrib.flatpages.urls')), ]
или:
- Добавьте
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'в настройкиMIDDLEWARE. - Запустите команду
manage.py migrate.
Как это работает
manage.py migrate создаёт две таблицы в вашей базе данных: django_flatpage и django_flatpage_sites. django_flatpage — это справочная таблица, которая сопоставляет URL, заголовок и текст содержимого. django_flatpage_sites связывает flatpage со сайтом.
Использование URLconf
Существует несколько способов включить страницы flatpages в ваш URLconf. Вы можете назначить определённый путь для flatpages:
urlpatterns = [
path('pages/', include('django.contrib.flatpages.urls')),
]
Вы также можете настроить его как «глобальный» шаблон. В этом случае важно расположить шаблон в конце списка других urlpatterns:
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
re_path(r'^(?P<url>.*/)$', views.flatpage),
]
Предупреждение
Если вы установили APPEND_SLASH в False, необходимо убрать слеш из глобального шаблона, иначе flatpages без трейлинга слеша не будут соответствовать.
Ещё один распространённый способ — использовать flatpages для ограниченного набора известных страниц и жестко закодировать URL, чтобы можно было обращаться к ним с помощью тега шаблона url:
from django.contrib.flatpages import views
urlpatterns += [
path('about-us/', views.flatpage, {'url': '/about-us/'}, name='about'),
path('license/', views.flatpage, {'url': '/license/'}, name='license'),
]
Использование middleware
Класс FlatpageFallbackMiddleware может выполнить всю работу.
-
class FlatpageFallbackMiddleware -
Каждый раз, когда любое Django-приложение генерирует ошибку 404, этот middleware проверяет базу данных flatpages на запрашиваемый URL в качестве последней меры. Конкретно, он ищет flatpage с данным URL и идентификатором сайта, соответствующим настройке
SITE_ID.Если совпадение найдено, выполняется следующий алгоритм:
- Если у flatpage есть пользовательский шаблон, он загружает этот шаблон. В противном случае, загружается шаблон
flatpages/default.html. - Он передаёт этому шаблону единственную переменную контекста,
flatpage, которая является объектом flatpage. ИспользуетсяRequestContextдля рендеринга шаблона.
Middleware добавит трейлинг слеш и перенаправит (с учётом настройки
APPEND_SLASH), если полученный URL относится к действительной flatpage. Перенаправление является постоянным (статус-код 301).Если совпадение не найдено, обработка запроса продолжается как обычно.
Middleware активируется только для ошибок 404, а не для 500 или ответов с другими кодами статуса.
- Если у flatpage есть пользовательский шаблон, он загружает этот шаблон. В противном случае, загружается шаблон
Flatpages не будут применять middleware представления
Поскольку FlatpageFallbackMiddleware применяется только после того, как решение URL потерпело неудачу и было сгенерировано 404, возвращаемый ответ не применит методы middleware представления. Только запросы, которые успешно маршрутизированы в представление через обычное решение URL, применяют middleware представления.
Обратите внимание на порядок следования MIDDLEWARE. Обычно вы можете поместить FlatpageFallbackMiddleware в конец списка. Это означает, что он будет работать первым при обработке ответа и гарантирует, что любой другой middleware обработки ответа увидит реальный ответ flatpage, а не 404.
Для получения дополнительной информации о middleware, ознакомьтесь с документацией по middleware.
Убедитесь, что ваш шаблон 404 работает
Обратите внимание, что FlatpageFallbackMiddleware включается только после того, как другое представление успешно сгенерировало ответ 404. Если другое представление или middleware-класс пытается сгенерировать 404, но вместо этого вызывает исключение, ответ станет HTTP 500 («Внутренняя ошибка сервера»), и FlatpageFallbackMiddleware не попытается предоставить страницу flatpage.
Как добавлять, изменять и удалять flatpages
Через административный интерфейс
Если вы активировали автоматический административный интерфейс Django, вы должны увидеть раздел «Flatpages» на главной странице администрирования. Редактируйте flatpages, как и любые другие объекты в системе.
Модель 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)
Через Python-API
-
class FlatPage -
Flatpages представлены стандартной моделью Django, которая находится в django/contrib/flatpages/models.py. Вы можете получить доступ к объектам flatpage через API базы данных Django.
Проверка на дубликаты URL flatpage.
Если вы добавляете или изменяете flatpages через собственный код, вам, вероятно, захочется проверить наличие дубликатов URL flatpage в рамках одного сайта. Форма flatpage, используемая в админ-панели, выполняет эту проверку валидации, и её можно импортировать из django.contrib.flatpages.forms.FlatpageForm и использовать в собственных представлениях.
Шаблоны flatpage
По умолчанию flatpages рендерятся через шаблон flatpages/default.html, но вы можете переопределить его для конкретного flatpage: в админ-панели в развёрнутом поле «Дополнительные параметры» (нажмите, чтобы развернуть) есть поле для указания имени шаблона. Если вы создаёте flatpage через Python-API, вы можете задать имя шаблона как поле template_name объекта FlatPage.
Вы сами должны создать шаблон flatpages/default.html; в вашей папке с шаблонами создайте папку flatpages и содержащий файл default.html.
Шаблонам flatpage передаётся одна переменная контекста, flatpage, которая является объектом flatpage.
Вот пример шаблона flatpages/default.html:
<!DOCTYPE html>
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
Поскольку вы уже вводите исходный HTML в страницу администрирования для flatpage, как flatpage.title так и flatpage.content помечены как не требующие автоматической экранизации HTML в шаблоне.
Получение списка объектов FlatPage в ваших шаблонах
Приложение flatpages предоставляет тег шаблона, который позволяет перебирать все доступные flatpages на текущем сайте.
Как и все пользовательские теги шаблонов, вам необходимо загрузить его пользовательскую библиотеку тегов, прежде чем вы сможете использовать его. После загрузки библиотеки вы можете получить все текущие 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 flatpages
По умолчанию, тег шаблона get_flatpages будет отображать только страницы, помеченные registration_required = False. Если вы хотите отображать защищенные регистрацией страницы, необходимо указать авторизованного пользователя с помощью for условия.
Например:
{% get_flatpages for someuser as about_pages %}
Если вы предоставите анонимного пользователя, get_flatpages будет вести себя так же, как если бы вы не предоставили пользователя — то есть, он будет отображать только публичные страницы.
Ограничение страниц по базовому URL
Необязательный аргумент starts_with, может быть применён для ограничения возвращаемых страниц теми, которые начинаются с определённого базового 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/3.2/ref/contrib/flatpages/