Spec-Zone.ru › Django 1.9

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

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

Класс 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_CLASSES имеет значение. Обычно вы можете поместить 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)

Поле 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: в административном интерфейсе в разделе «Дополнительные параметры» (нажав, чтобы развернуть его) есть поле для указания имени шаблона. Если вы создаёте flat page через 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:

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

Этот класс доступен начиная с 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.9/ref/contrib/flatpages/

Spec-Zone.ru

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