Приложение Flatpages

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

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

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

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

Установка

Чтобы установить приложение 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 связывает плоскую страницу с сайтом.

Использование 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),
]

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

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

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

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

FlatpageFallbackMiddleware Может сделать всю работу.

класс FlatpageFallbackMiddleware

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

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

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

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

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

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

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

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

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

Дополнительные сведения о промежуточном программном обеспечении см. В документации по промежуточному программному обеспечению .

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

Обратите внимание, что FlatpageFallbackMiddleware единственные шаги в следующем представлении успешно привели к ответу 404. Если другой класс представления или промежуточного программного обеспечения пытается создать 404, но вместо этого вызывает исключение, ответ станет HTTP 500 («Внутренняя ошибка сервера») и FlatpageFallbackMiddleware не будет пытаться обслуживать плоскую страницу.

Как добавлять, изменять и удалять плоские страницы

Через интерфейс администратора

Если вы активировали автоматический интерфейс администратора Django, вы должны увидеть раздел «Плоские страницы» на странице индекса администратора. Редактируйте плоские страницы так же, как редактируете любой другой объект в системе.

В 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

класс FlatPage

Flatpages представлены стандартной моделью Django , которая находится в django / contrib / flatpages / models.py . Вы можете получить доступ к объектам плоских страниц через API базы данных Django .

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

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

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

По умолчанию плоские страницы отображаются через шаблон flatpages/default.html, но вы можете переопределить это для конкретной плоской страницы: в панели администратора свернутый набор полей под названием «Дополнительные параметры» (щелчок по нему откроет его) содержит поле для указания имени шаблона. Если вы создаете плоскую страницу с помощью API Python вы можете установить имя шаблона в поле 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помечены как не требующие автоматического экранирования 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 = Falsefor

Например:

{% 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

класс FlatPageSitemap

В sitemaps.FlatPageSitemapклассе смотрит на всех общедоступном flatpagesопределен для тока SITE_ID(см ) и создает запись в карте сайта. Эти данные включают в себя только атрибут - не , или .sites documentationlocationlastmodchangefreqpriority

Пример

Вот пример использования 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'),
]

Copyright ©2021 All rights reserved