Приложение 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
Существует несколько способов включить плоские страницы в ваш 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, иначе 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 не будет пытаться предоставить плоскую страницу.
Как добавлять, изменять и удалять 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.0/ref/contrib/flatpages/