Приложение flatpages
Django поставляется с необязательным приложением «flatpages». Оно позволяет хранить простое «плоское» HTML-содержимое в базе данных и управлять им через административный интерфейс Django и Python-API.
Flatpage — это простой объект с URL, заголовком и содержимым. Используйте его для одноразовых страниц со специальными случаями, таких как страницы «О нас» или «Политика конфиденциальности», которые вы хотите хранить в базе данных, но для которых не хотите разрабатывать пользовательское приложение Django.
Flatpage может использовать пользовательский шаблон или системный по умолчанию. Он может быть связан с одним или несколькими сайтами.
Поле с содержимым можно оставить пустым, если вы предпочитаете разместить содержимое в пользовательском шаблоне.
Вот несколько примеров flatpages на сайтах, работающих на Django:
Установка
Чтобы установить приложение flatpages, выполните следующие шаги:
-
Установите приложение
sites framework, добавив'django.contrib.sites'в настройкуINSTALLED_APPS, если она там ещё не есть.Также убедитесь, что вы правильно установили
SITE_IDв ID сайта, который представляет файл настроек. Обычно это1(то естьSITE_ID = 1, но если вы используете фреймворк сайтов для управления несколькими сайтами, это может быть ID другого сайта). - Добавьте
'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
Существует несколько способов включения страниц flatpages в ваш URLconf. Вы можете выделить определённый путь для flatpages:
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 без конечного слеша не будут соответствовать.
Другая распространённая настройка заключается в использовании flatpages для ограниченного набора известных страниц и жестком кодировании 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 добавит конечный слеш и перенаправит (проверит настройку
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 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)
Через Python-API
-
class FlatPage -
Flatpages представлены стандартной моделью Django, которая находится в django/contrib/flatpages/models.py. Вы можете получить доступ к объектам flatpage через Django-API базы данных.
Проверка на дубликаты URL flatpage.
Если вы добавляете или изменяете flatpage с помощью собственного кода, вам, скорее всего, потребуется проверить наличие дубликатов 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 на текущем сайте.
END_OF_DOCUMENT_MARKERКак и все пользовательские теги шаблонов, вам необходимо загрузить его библиотеку пользовательских тегов, прежде чем вы сможете его использовать. После загрузки библиотеки вы можете получить доступ ко всем текущим страницам плоского типа с помощью тега 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.11/ref/contrib/flatpages/