Spec-Zone.ru › Django 2.2

Приложение flatpages

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

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

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

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

Установка

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

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

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

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

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

from django.contrib.flatpages import views

# Your other patterns here
urlpatterns += [
    path('<path:url>', views.flatpage),
]

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

Если вы установили APPEND_SLASH в значение False, вам необходимо удалить слеш в шаблоне catchall, иначе 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 и ID сайта, соответствующего настройке 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 не попытается отобразить плоскую страницу.

Как добавить, изменить и удалить 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: в администраторе, в раскрывающемся наборе опций с заголовком «Дополнительные параметры» (нажмите, чтобы развернуть) есть поле для указания имени шаблона. Если вы создаёте плоскую страницу через 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 [source]

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

Spec-Zone.ru

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