Приложение 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_CLASSES. - Запустите команду
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 без конечной косой черты не будут соответствовать.
Другая распространённая настройка — использовать 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
Класс 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_CLASSES имеет значение. Обычно вы можете поместить 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: в административном интерфейсе в разделе «Дополнительные параметры» (нажав, чтобы развернуть его) есть поле для указания имени шаблона. Если вы создаёте flat page через 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.Этот класс доступен начиная с
django.contrib.sitemaps.FlatPageSitemapв более старых версиях Django.
Пример
Вот пример 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.9/ref/contrib/flatpages/