Spec-Zone.ru › Django 1.8

Приложение flatpages

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

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

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

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

Вот несколько примеров flatpages на сайтах, работающих на Django:

  • http://www.lawrence.com/about/contact/
  • http://www2.ljworld.com/site/rules/

Установка

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

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

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

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

Затем либо:

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

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

или:

  1. Добавьте 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware' в настройки MIDDLEWARE_CLASSES.
  2. Запустите команду manage.py migrate.

Как это работает

manage.py migrate создаёт две таблицы в вашей базе данных: django_flatpage и django_flatpage_sites. django_flatpage — это простая справочная таблица, которая просто сопоставляет URL, заголовок и содержимое. django_flatpage_sites связывает flatpage со сайтом.

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

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

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

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

from django.contrib.flatpages import views

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

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

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

Другая распространённая настройка — использование flat pages для ограниченного набора известных страниц и жёсткое кодирование URL-адресов, так что вы можете ссылаться на них с помощью тега шаблона url:

from django.contrib.flatpages import views

urlpatterns += [
    url(r'^about-us/$', views.flatpage, {'url': '/about-us/'}, name='about'),
    url(r'^license/$', views.flatpage, {'url': '/license/'}, name='license'),
]

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

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

class FlatpageFallbackMiddleware [source]

Каждый раз, когда любое приложение 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_CLASSES. Как правило, вы можете поместить FlatpageFallbackMiddleware в конец списка. Это означает, что он будет работать первым при обработке ответа и гарантирует, что любой другой middleware для обработки ответа увидит реальный ответ flatpage, а не 404.

Подробнее о middleware можно прочитать в документации по middleware.

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

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

Как добавить, изменить и удалить flatpages

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

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

Через Python-API

class FlatPage [source]

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 [source]

Класс sitemaps.FlatPageSitemap рассматривает все публично видимые flatpages, определённые для текущего SITE_ID (см. sites documentation) и создаёт запись в карте сайта. Эти записи включают только атрибут location — а не lastmod, changefreq или priority.

Этот класс доступен начиная с django.contrib.sitemaps.FlatPageSitemap в более старых версиях Django.

Пример

Вот пример файла URLconf, использующего FlatPageSitemap:

from django.conf.urls import url
from django.contrib.flatpages.sitemaps import FlatPageSitemap
from django.contrib.sitemaps.views import sitemap

urlpatterns = [
    # ...

    # the sitemap
    url(r'^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/1.8/ref/contrib/flatpages/

Spec-Zone.ru

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