Spec-Zone.ru › Django 3.2

Приложение flatpages

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

Flatpage — это объект с URL, названием и содержимым. Используйте его для страниц с особым случаем, например, «О нас» или «Политика конфиденциальности», которые вы хотите хранить в базе данных, но для которых не хотите разрабатывать пользовательское приложение Django.

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

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

Установка

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

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

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

  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 связывает flatpage со сайтом.

Использование URLconf

Существует несколько способов включить страницы flatpages в ваш URLconf. Вы можете назначить определённый путь для flatpages:

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

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

from django.contrib.flatpages import views

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

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

Если вы установили APPEND_SLASH в False, необходимо убрать слеш из глобального шаблона, иначе 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

Класс 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 или ответов с другими кодами статуса.

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

Класс 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/3.2/ref/contrib/flatpages/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API