Spec-Zone.ru › Django 1.10

Приложение 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.
  2. Выполните команду manage.py migrate.

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

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

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

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

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 без trailing слэша не будут соответствовать.

Ещё одна распространённая настройка — использовать 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

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

Если он находит совпадение, он выполняет следующий алгоритм:

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

Middleware будет добавлять trailing slash и перенаправлять (с учётом настройки 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 не попытается отдать страницу flat.

Как добавить, изменить и удалить 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 ugettext_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)
Изменено в Django 1.9:

Поле enable_comments было удалено из 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 страниц

По умолчанию, тег шаблона 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.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.10/ref/contrib/flatpages/

Spec-Zone.ru

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