Spec-Zone.ru › Django 4.1

Приложение flatpages

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

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

Flatpage может использовать пользовательский шаблон или стандартный шаблон 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. Вы можете выделить определенный путь для flat pages:

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, иначе flatpages без конечной косой черты не будут соответствовать.

Еще один распространенный метод — использовать flat pages для ограниченного набора известных страниц и жестко закодировать 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/4.1/ref/contrib/flatpages/

Spec-Zone.ru

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