Приложение flatpages
Django поставляется с необязательным приложением «flatpages». Оно позволяет хранить «плоское» HTML-содержимое в базе данных и управлять им через административный интерфейс Django и Python-API.
Flatpage — это объект с URL, заголовком и содержимым. Используйте его для одноразовых страниц со специальными случаями, таких как страницы «О нас» или «Политика конфиденциальности», которые вы хотите хранить в базе данных, но для которых не хотите разрабатывать собственное приложение Django.
Flatpage может использовать пользовательский шаблон или стандартный шаблон 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. Вы можете выделить определенный путь для flat pages:
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, иначе flatpages без конечной косой черты не будут соответствовать.
Еще один распространенный метод — использовать flat pages для ограниченного набора известных страниц и жестко закодировать 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/4.1/ref/contrib/flatpages/