Приложение для создания статических страниц¶
Django содержит приложения для создания статических страниц. Оно позволяет сохранять «статический» HTML и управлять ним через интерфейс администратора Django и Python API.
A flatpage is a object with a URL, title and content. Use it for one-off, special-case pages, such as «About» or «Privacy Policy» pages, that you want to store in a database but for which you don’t want to develop a custom Django application.
Статическая страница могжет использовать собственный шаблон, или шаблон по умолчанию, общий для всех статических страниц. Они могут быть связаны с одним или несколькими сайтами.
Содержимое может быть пустым, если вы предпочитаете указать его в шаблоне.
Установка¶
Чтобы установить приложение статических страниц, выполните следующие действия:
Установите
фреймворк для сайтов, добавив'django.contrib.sites'в настройкуINSTALLED_APPS, если он еще не добавлен.Также убедитесь, что настройки содержат правильный
SITE_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_CLASSES.Запустите команду
manage.py migrate.
Как это работает¶
manage.py migrate создает две таблицы в вашей базе данных: django_flatpage и django_flatpage_sites. django_flatpage – это таблица, которая связывает URL и содержимое страницы. django_flatpage_sites связывает страницу с конкретным сайтом.
Использование URLconf¶
Есть несколько способов добавить статические страницы в ваш URLconf. Вы можете добавить их к конкретному путю:
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:
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»)¶
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 («Internal Server Error») и FlatpageFallbackMiddleware не будет выполнен.
Как добавить, изменить и удалить статические страницы¶
Через интерфейс администратора¶
Если вы активировали интерфейс администратора 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¶
- class FlatPage¶
Статические страницы представлены моделью Django, которая находится в `django/contrib/flatpages/models.py`_. Вы можете обратиться к объектам статических страницы через Django ORM API.
Проверка уникальности URL статической страницы.
Если вы добавляете или изменяете статические страницы, скорее всего вам необходимо проверять, что URL страницы уникален для сайта. Форма, которая используется в админке, выполняет такую проверку, и может быть импортирована из django.contrib.flatpages.forms.FlatpageForm для использование в ваших представлениях.
Шаблоны статических страниц¶
По умолчанию плоские страницы отображаются с помощью шаблона :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>
<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'),
]