Приложение flatpages
Django поставляется с необязательным приложением «flatpages». Оно позволяет хранить простое «плоское» HTML-содержимое в базе данных и управлять им через административный интерфейс Django и Python API.
Flatpage — это простой объект с URL, заголовком и содержимым. Используйте его для отдельных страниц со специальным случаем, таких как страницы «О нас» или «Политика конфиденциальности», которые вы хотите хранить в базе данных, но для которых не хотите разрабатывать специальное приложение Django.
Flatpage может использовать пользовательский шаблон или системный шаблон по умолчанию для flatpage. Он может быть связан с одним или несколькими сайтами.
Поле содержимого можно оставить пустым, если вы предпочитаете размещать содержимое в пользовательском шаблоне.
Вот несколько примеров flatpages на сайтах, работающих на Django:
Установка
Чтобы установить приложение flatpages, выполните следующие шаги:
-
Установите приложение
sites framework, добавив'django.contrib.sites'в настройкиINSTALLED_APPS, если его там ещё нет.Также убедитесь, что вы правильно установили
SITE_IDна идентификатор сайта, который представляет файл настроек. Обычно это1(т.е.SITE_ID = 1, но если вы используете фреймворк сайтов для управления несколькими сайтами, это может быть идентификатор другого сайта). - Добавьте
'django.contrib.flatpages'в настройкиINSTALLED_APPS.
Затем либо:
-
Добавьте запись в ваш URLconf. Например:
urlpatterns = [ url(r'^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
Есть несколько способов включить страницы flat pages в ваш URLconf. Вы можете выделить определённый путь для flat pages:
urlpatterns = [
url(r'^pages/', include('django.contrib.flatpages.urls')),
]
Вы также можете настроить его как шаблон «catchall». В этом случае важно разместить шаблон в конце других urlpatterns:
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
url(r'^(?P<url>.*/)$', views.flatpage),
]
Предупреждение
Если вы установили APPEND_SLASH в False, вы должны удалить слэш в шаблоне catchall, иначе flatpages без trailing слэша не будут соответствовать.
Ещё одна распространённая настройка — использовать flat pages для ограниченного набора известных страниц и жёстко закодировать URL, чтобы вы могли ссылаться на них с помощью тега шаблона url:
from django.contrib.flatpages import views
urlpatterns += [
url(r'^about-us/$', views.flatpage, {'url': '/about-us/'}, name='about'),
url(r'^license/$', views.flatpage, {'url': '/license/'}, name='license'),
]
Использование middleware
Middleware FlatpageFallbackMiddleware может выполнить всю работу.
-
class FlatpageFallbackMiddleware -
Каждый раз, когда любое приложение Django вызывает ошибку 404, этот middleware проверяет базу данных flatpages для запрошенного URL в качестве последней попытки. В частности, он проверяет flatpage с заданным URL с идентификатором сайта, который соответствует настройке
SITE_ID.Если он находит совпадение, он выполняет следующий алгоритм:
- Если у flatpage есть пользовательский шаблон, он загружает этот шаблон. В противном случае загружает шаблон
flatpages/default.html. - Он передает этому шаблону единственную переменную контекста
flatpage, которая представляет собой объект flatpage. Он используетRequestContextпри отрисовке шаблона.
Middleware будет добавлять trailing slash и перенаправлять (с учётом настройки
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 не попытается отдать страницу flat.
Как добавить, изменить и удалить 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 ugettext_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)
Поле enable_comments было удалено из 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 страниц
По умолчанию, тег шаблона 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[source] -
Класс
sitemaps.FlatPageSitemapрассматривает все публично видимыеflatpages, определённые для текущегоSITE_ID(см.sites documentation) и создаёт запись в карте сайта. Эти записи включают только атрибутlocation– неlastmod,changefreqилиpriority.
Пример
Вот пример URLconf, использующего FlatPageSitemap:
from django.conf.urls import url
from django.contrib.flatpages.sitemaps import FlatPageSitemap
from django.contrib.sitemaps.views import sitemap
urlpatterns = [
# ...
# the sitemap
url(r'^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/1.10/ref/contrib/flatpages/