Приложение для создания статических страниц¶
Django содержит приложения для создания статических страниц. Оно позволяет сохранять «статический» HTML и управлять ним через интерфейс администратора Django и Python API.
Флэт-страница — это объект с URL-адресом, заголовком и контентом. Используйте его для одноразовых страниц особого случая, таких как страницы «О программе» или «Политика конфиденциальности», которые вы хотите сохранить в базе данных, но для которых вы не хотите разрабатывать собственное приложение Django.
Статическая страница могжет использовать собственный шаблон, или шаблон по умолчанию, общий для всех статических страниц. Они могут быть связаны с одним или несколькими сайтами.
Содержимое может быть пустым, если вы предпочитаете указать его в шаблоне.
Установка¶
Чтобы установить приложение статических страниц, выполните следующие действия:
Установите
фреймворк для сайтов, добавив'django.contrib.sites'в настройкуINSTALLED_APPS, если он еще не добавлен.Также убедитесь, что вы правильно установили
SITE_IDдля идентификатора сайта, который представляет файл настроек. Обычно это1(т. е.SITE_ID = 1), но если вы используете платформу сайтов для управления несколькими сайтами, это может быть идентификатор другого сайта.Добавьте
'django.contrib.flatpages'в настройкуINSTALLED_APPS.
Затем или:
Добавьте запись в URLconf. Например:
urlpatterns = [ path("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 связывает страницу с конкретным сайтом.
Использование URLconf¶
Есть несколько способов включить плоские страницы в вашу конфигурацию URL. Вы можете выделить определенный путь для плоских страниц:
urlpatterns = [
path("pages/", include("django.contrib.flatpages.urls")),
]
Или же использовать URL-шаблон, который будет перехватывать все запросы. В этом случае важно добавить его в самом конце:
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
re_path(r"^(?P<url>.*/)$", views.flatpage),
]
Предупреждение
Если вы указали False в APPEND_SLASH, вам следует убрать косую черту в конце URL-шаблона.
Другая распространенная настройка — использование плоских страниц для ограниченного набора известных страниц и жесткое кодирование их URL-адресов в URLconf:
from django.contrib.flatpages import views
urlpatterns += [
path("about-us/", views.flatpage, kwargs={"url": "/about-us/"}, name="about"),
path("license/", views.flatpage, kwargs={"url": "/license/"}, name="license"),
]
Аргумент kwargs устанавливает значение URL, используемое для поиска модели FlatPage в представлении плоской страницы.
Аргумент name позволяет инвертировать URL-адрес в шаблонах, например, с помощью тега шаблона url.
Использование промежуточного слоя(«middleware»)¶
FlatpageFallbackMiddleware обеспечивает работу статических страниц.
- class FlatpageFallbackMiddleware¶
Каждый раз, когда приложение Django вызывает 404 ошибку, это промежуточный слой проверяет базу данных статических страниц на наличие запрашиваемого URL. Точнее выполняется поиск простой страницы с текущим URL и ID сайта из настройки
SITE_ID.Если страница найдена:
Загружается собственный шаблон для страницы, если такой указан, иначе загружается
flatpages/default.html.В шаблон передается одна переменная,
flatpage, которая содержит объект страницы. При рендеринге шаблона используетсяRequestContext.
Промежуточный слой только добавляет слэш и перенаправляет (проверяя настройку
APPEND_SLASH), если полученный URL указывает на статическую страницу. Перенаправление постоянные (301 код ответа).Если страница не найдена, запрос обрабатывается как обычно.
Промежуточный слой активируется только при 404 ответе, 500 и прочие игнорируются.
К простым страницам не применяется process_view промежуточных слоев
Так как FlatpageFallbackMiddleware применяется после того, как поиск URL-а провалился и мы получили 404, ответ не будет обрабатываться методом process_view промежуточных слоев. Только при успешной обработке URL-а и вызове представления вызываются эти методы.
Обратите внимание, порядок MIDDLEWARE_CLASSES важен. В общем вы можете указать FlatpageFallbackMiddleware в конце списка. Он будет выполнен первым при обработке ответа, и все остальные промежуточные слои(middleware) увидят ответ со страницей, а не 404.
Подробнее смотрите в разделе о промежуточных слоях.
Убедитесь, что ваш 404 шаблон работает
Обратите внимание, что FlatpageFallbackMiddleware вступает в действие только после того, как другое представление успешно выдало ответ 404. Если другое представление или класс промежуточного программного обеспечения попытается создать ошибку 404, но вместо этого выдаст исключение, ответом станет HTTP 500 («Внутренняя ошибка сервера») и FlatpageFallbackMiddleware не будет пытаться обслуживать неструктурированную страницу.
Как добавить, изменить и удалить статические страницы¶
Предупреждение
Разрешения на добавление или редактирование плоских страниц должны быть предоставлены только доверенным пользователям. Плоские страницы определяются с помощью необработанного HTML и не очищаются Django. Как следствие, вредоносная неструктурированная страница может привести к различным уязвимостям безопасности, включая повышение разрешений.
Через интерфейс администратора¶
Если вы активировали интерфейс администратора Django, вы увидите раздел «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¶
Плоские страницы представлены стандартной моделью Django, FlatPage. Вы можете получить доступ к объектам плоских страниц через API базы данных Django.
Проверка уникальности URL статической страницы.
Если вы добавляете или изменяете статические страницы, скорее всего вам необходимо проверять, что URL страницы уникален для сайта. Форма, которая используется в админке, выполняет такую проверку, и может быть импортирована из django.contrib.flatpages.forms.FlatpageForm для использование в ваших представлениях.
Модель FlatPage¶
- class models.FlatPage¶
Поля¶
Объекты FlatPage имеют следующие поля:
- class models.FlatPage
- url¶
Необходимый. 100 символов или меньше. Индексируется для более быстрого поиска.
- title¶
Необходимый. 200 символов или меньше.
- content¶
Необязательно (
blank=True).TextField, который обычно содержит HTML-содержимое страницы.
- enable_comments¶
Логическое значение. Это поле не используется
flatpagesпо умолчанию и не отображается в интерфейсе администратора. Подробное объяснение см. в разделе интерфейса администратора Flatpages <flatpages-admin>`.
- template_name¶
Необязательно (
blank=True). 70 символов или меньше. Указывает шаблон, используемый для отображения страницы. По умолчанию используется :file:` Flatpages/default.html`, если не указано иное.
Методы¶
Шаблоны статических страниц¶
По умолчанию плоские страницы отображаются с помощью шаблона :file:` Flatpages/default.html`, но вы можете переопределить это для конкретной плоской страницы: в панели администратора свернутый набор полей под названием «Дополнительные параметры» (при нажатии на него вы развернетесь) содержит поле для указания имени шаблона. Если вы создаете плоскую страницу через API Python, вы можете установить имя шаблона в поле «template_name» в объекте «FlatPage».
Создание шаблона :file:` Flatpages/default.html` является вашей ответственностью; в каталоге вашего шаблона создайте каталог :file:` Flatpages`, содержащий файл default.html.
Шаблонам плоских страниц передается одна контекстная переменная, Flatpage, которая является объектом плоской страницы.
Вот пример шаблона :file:` Flatpages/default.html`:
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
Поскольку вы уже вводите необработанный HTML-код на страницу администратора плоской страницы, и Flatpage.title, и Flatpage.content помечаются как не, требующие автоматического экранирования HTML в шаблоне.
Получение списка объектов FlatPage в ваших шаблонах¶
Приложение 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¶
Класс
sitemaps.FlatPageSitemapпросматривает все публично видимыеflatpages, определенные для текущегоSITE_ID(см. документациюsites) и создает запись в карте сайта. Эти записи включают только атрибутlocation, а неlastmod,changefreqилиpriority.
Пример¶
Вот пример конфигурации URL с использованием 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",
),
]