Приложение 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, но если вы используете фреймворк sites для управления несколькими сайтами, это может быть идентификатор другого сайта). - Добавьте
'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. Вы можете выделить определенный путь для flatpages:
urlpatterns = [
path('pages/', include('django.contrib.flatpages.urls')),
]
Вы также можете настроить его как шаблон «catchall». В этом случае важно разместить шаблон в конце других urlpatterns:
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
path('<path:url>', views.flatpage),
]
Предупреждение
Если вы установили APPEND_SLASH в False, вы должны удалить слеш в шаблоне catchall, иначе flatpages без заключительного слэша не будут сопоставлены.
Другая распространенная настройка заключается в использовании 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
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[source] -
Класс
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/2.1/ref/contrib/flatpages/