Приложение flatpages
Django поставляется с необязательным приложением «flatpages». Оно позволяет хранить простое «плоское» HTML-содержимое в базе данных и управлять им через интерфейс администратора Django и Python-API.
Flatpage — это простой объект с URL, заголовком и содержимым. Используйте его для одноразовых страниц со специальными случаями, таких как страницы «О нас» или «Политика конфиденциальности», которые вы хотите хранить в базе данных, но для которых не хотите разрабатывать собственное приложение Django.
Flatpage может использовать пользовательский шаблон или стандартный шаблон 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 = [ 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 с ID сайта, соответствующим настройке
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 через Django API базы данных.
Проверка на дубликаты URL flatpages.
Если вы добавляете или изменяете 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 будет отображать только страницы flatpages, которые помечены registration_required = False. Если вы хотите отобразить страницы flatpages, защищённые регистрацией, вам необходимо указать авторизованного пользователя с помощью for.
Например:
{% get_flatpages for someuser as about_pages %}
Если вы предоставите анонимного пользователя, get_flatpages будет вести себя так же, как если бы вы не предоставили пользователя — то есть, он будет отображать только публичные страницы flatpages.
Ограничение страниц 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.0/ref/contrib/flatpages/