Приложение flatpages

Django поставляется с дополнительным приложением «flatpages». Оно позволяет хранить «плоский» HTML-контент в базе данных и управлять им через интерфейс администратора Django и Python API.

A flatpage is an 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.

Плоская страница может использовать пользовательский шаблон или шаблон по умолчанию, общесистемный шаблон плоской страницы. Она может быть связана с одним или несколькими сайтами.

Поле содержимого можно по желанию оставить пустым, если вы предпочитаете поместить содержимое в пользовательский шаблон.

Установка

Чтобы установить приложение flatpages, выполните следующие действия:

  1. Установите sites framework, добавив 'django.contrib.sites' к настройке INSTALLED_APPS, если его там еще нет.

    Также убедитесь, что вы правильно установили SITE_ID в качестве ID сайта, который представляет файл настроек. Обычно это 1 (т.е. SITE_ID = 1, но если вы используете фреймворк сайтов для управления несколькими сайтами, это может быть ID другого сайта.

  2. Добавьте 'django.contrib.flatpages' к настройке INSTALLED_APPS.

Тогда либо:

  1. Добавьте запись в URLconf. Например:

    urlpatterns = [
        path('pages/', include('django.contrib.flatpages.urls')),
    ]
    

или:

  1. Добавьте 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware' к настройке MIDDLEWARE.
  2. Выполните команду 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')),
]

Вы также можете установить его в качестве шаблона «catchall». В этом случае важно поместить шаблон в конец других urlpatterns:

from django.contrib.flatpages import views

# Your other patterns here
urlpatterns += [
    re_path(r'^(?P<url>.*/)$', views.flatpage),
]

Предупреждение

Если вы установите APPEND_SLASH в False, вы должны удалить косую черту в шаблоне catchall, иначе плоские страницы без косой черты не будут сопоставлены.

Другая распространенная настройка - использование плоских страниц для ограниченного набора известных страниц и жесткое кодирование урлов, так что вы можете ссылаться на них с помощью тега шаблона 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'),
]

Использование промежуточного программного обеспечения

FlatpageFallbackMiddleware может выполнить всю работу.

class FlatpageFallbackMiddleware

Каждый раз, когда любое приложение Django выдает ошибку 404, это промежуточное ПО проверяет базу данных flatpages на наличие запрашиваемого URL в качестве последнего средства. В частности, она проверяет наличие плоской страницы с заданным URL с идентификатором сайта, который соответствует настройке SITE_ID.

Если он находит совпадение, то следует этому алгоритму:

  • Если у плоской страницы есть пользовательский шаблон, то загружается этот шаблон. В противном случае загружается шаблон flatpages/default.html.
  • Он передает этому шаблону единственную контекстную переменную flatpage, которая является объектом flatpage. Он использует RequestContext при рендеринге шаблона.

Промежуточное ПО будет добавлять косую черту и перенаправлять (глядя на параметр APPEND_SLASH), только если полученный URL ссылается на действительную плоскую страницу. Перенаправления являются постоянными (код состояния 301).

Если он не находит совпадения, запрос продолжает обрабатываться как обычно.

Промежуточное ПО активируется только для 404 - не для 500 или ответов с любым другим кодом состояния.

Flatpages не будет применять промежуточное ПО представления

Поскольку FlatpageFallbackMiddleware применяется только после того, как разрешение URL не удалось и выдало 404, ответ, который он возвращает, не будет применять никаких методов view middleware. Только запросы, которые успешно направляются к представлению через обычное разрешение URL, применяют промежуточное ПО представления.

Обратите внимание, что порядок MIDDLEWARE имеет значение. Как правило, FlatpageFallbackMiddleware можно поместить в конец списка. Это означает, что он будет запущен первым при обработке ответа, и гарантирует, что любое другое промежуточное ПО, обрабатывающее ответ, увидит настоящий ответ плоской страницы, а не 404.

Подробнее о промежуточном программном обеспечении читайте в middleware docs.

Убедитесь, что ваш шаблон 404 работает

Обратите внимание, что FlatpageFallbackMiddleware включается только после того, как другое представление успешно создало ответ 404. Если другое представление или класс промежуточного ПО попытается выдать 404, но вместо этого вызовет исключение, ответ станет HTTP 500 («Внутренняя ошибка сервера»), и 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)

Через API Python

class FlatPage

Плоские страницы представлены стандартным Django model, который живет в django/contrib/flatpages/models.py. Доступ к объектам flatpage осуществляется через Django database API.

Проверьте, не дублируются ли URL-адреса плоских страниц.

Если вы добавляете или изменяете плоские страницы с помощью собственного кода, вы, вероятно, захотите проверить наличие дубликатов URL плоских страниц на одном сайте. Форма плоской страницы, используемая в админке, выполняет эту проверку, и может быть импортирована из django.contrib.flatpages.forms.FlatpageForm и использована в ваших собственных представлениях.

Шаблоны плоских страниц

По умолчанию плоские страницы отображаются по шаблону flatpages/default.html, но вы можете отменить это для конкретной плоской страницы: в админке в свернутом поле «Дополнительные опции» (щелчок по нему развернет его) есть поле для указания имени шаблона. Если вы создаете плоскую страницу через Python API, вы можете задать имя шаблона как поле template_name на объекте FlatPage.

Создание шаблона flatpages/default.html является вашей обязанностью; в каталоге вашего шаблона создайте каталог flatpages, содержащий файл default.html.

Шаблонам плоских страниц передается единственная контекстная переменная flatpage, которая является объектом плоской страницы.

Вот пример шаблона flatpages/default.html:

<!DOCTYPE html>
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>

Поскольку вы уже вводите необработанный HTML в административную страницу для плоской страницы, и flatpage.title, и flatpage.content помечены как не требующие automatic HTML escaping в шаблоне.

Получение списка объектов FlatPage в ваших шаблонах

Приложение flatpages предоставляет тег шаблона, который позволяет перебирать все доступные flatpages на странице current site.

Как и все теги пользовательских шаблонов, перед его использованием вам потребуется load its custom tag library. После загрузки библиотеки вы можете получить все текущие плоские страницы с помощью тега 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 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'),
]
Вернуться на верх