Как включить фронтенд-редактирование для моделей Page и Django

Добавлено в версии 3.0.

Помимо PlaceholderFields, «обычные» поля Django-модели (как на страницах CMS, так и в ваших собственных Django-моделях) также можно редактировать через интерфейс редактирования фронтенда django CMS. Это очень удобно для пользователя, так как избавляет его от необходимости переключаться между фронтендом и админкой.

В этом интерфейсе значения экземпляров модели, которые можно редактировать, при наведении показывают подсказку «Дважды щелкните для редактирования». При двойном щелчке открывается всплывающее окно, содержащее форму изменения для данной модели.

Примечание

В настоящее время этот интерфейс недоступен для пользователей сенсорных экранов, но он будет улучшен в будущих выпусках.

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

Эта возможность лишь частично совместима с django-hvad: использование render_model с hvad-переведенными полями (скажем, {% render_model object 'translated_field' %}) возвращает ошибку, если hvad-enabled объект не существует в текущем языке. В качестве обходного пути вместо этого можно использовать render_model_icon.

Теги шаблона

Эта функция основана на пяти тегах шаблонов, имеющих общий код. Все они требуют, чтобы вы {% load cms_tags %} в вашем шаблоне:

  • render_model (для редактирования определенного поля)

  • render_model_block (для редактирования любого из полей в определенном блоке)

  • render_model_icon (для редактирования поля, представленного другим значением, например, изображением)

  • render_model_add (для добавления экземпляра указанной модели)

  • render_model_add_block (для добавления экземпляра указанной модели)

Посмотрите страницу конкретного тега для более подробной справки и обсуждения ограничений и предостережений.

Редактирование заголовков страниц

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

Основное заглавие:

{% render_model request.current_page "title" %}

Название страницы:

{% render_model request.current_page "page_title" %}

Название меню:

{% render_model request.current_page "menu_title" %}

Все три названия:

{% render_model request.current_page "titles" %}

Вы всегда можете настроить редактируемые поля, указав параметр edit_field:

{% render_model request.current_page "title" "page_title,menu_title" %}

Редактирование «обычных» моделей Django

Как отмечалось выше, ваши собственные модели Django также могут представлять свои поля для редактирования во фронтенде. Это достигается с помощью базового класса FrontendEditableAdminMixin.

Обратите внимание, что это требуется только для полей иначе чем PlaceholderFields. PlaceholderFields автоматически становятся доступными для редактирования во фронтенде.

Настройте класс администратора модели

Настройте свой класс администратора, добавив к нему миксин FrontendEditableAdminMixin (см. Django admin documentation для общей информации об администраторах Django):

from cms.admin.placeholderadmin import FrontendEditableAdminMixin
from django.contrib import admin


class MyModelAdmin(FrontendEditableAdminMixin, admin.ModelAdmin):
    ...

Порядок важен: как обычно, миксины должны быть на первом месте.

Затем настройте шаблоны, в которых вы хотите выставить модель для редактирования, добавив тег шаблона render_model:

{% load cms_tags %}

{% block content %}
<h1>{% render_model instance "some_attribute" %}</h1>
{% endblock content %}

Документацию по аргументам смотрите в template tag reference.

Редактирование выбранных полей

Для набора полей также возможно фронтальное редактирование.

Настройте администратора

Вам нужно добавить в модель администратора кортеж полей, редактируемых из фронтенд-администратора:

from cms.admin.placeholderadmin import FrontendEditableAdminMixin
from django.contrib import admin


class MyModelAdmin(FrontendEditableAdminMixin, admin.ModelAdmin):
    frontend_editable_fields = ("foo", "bar")
    ...

Настройка шаблона

Затем добавьте список полей через запятую (или просто название одного поля) в тег шаблона:

{% load cms_tags %}

{% block content %}
<h1>{% render_model instance "some_attribute" "some_field,other_field" %}</h1>
{% endblock content %}

Специальные атрибуты

Аргумент тега шаблона attribute не обязательно должен быть полем модели, свойство или метод также могут быть использованы в качестве цели; в случае метода, он будет вызван с запросом в качестве аргумента.

Пользовательские представления

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

Пользовательское представление может быть передано либо как именованный url (параметр view_url), либо как имя метода (или свойства) редактируемого экземпляра (параметр view_method). В случае, если вы передадите view_method, он будет вызываться всякий раз, когда будет оценен тег шаблона с request в качестве параметра.

Пользовательскому представлению не нужно подчиняться какому-либо определенному интерфейсу; оно получит значение edit_fields в качестве параметра GET.

Документацию по аргументам смотрите в template tag reference.

Пример view_url:

{% load cms_tags %}

{% block content %}
<h1>{% render_model instance "some_attribute" "some_field,other_field" "" "admin:exampleapp_example1_some_view" %}</h1>
{% endblock content %}

Пример view_method:

class MyModel(models.Model):
    char = models.CharField(max_length=10)

    def some_method(self, request):
        return "/some/url"


{% load cms_tags %}

{% block content %}
<h1>{% render_model instance "some_attribute" "some_field,other_field" "" "" "some_method" %}</h1>
{% endblock content %}

Список изменений модели

При использовании специального ключевого слова changelist в качестве поля редактирования во фронтенд-редакции будет отображаться список изменений модели:

{% render_model instance "name" "changelist" %}

Будет оказывать:

<div class="cms-plugin cms-plugin-myapp-mymodel-changelist-1">
    My Model Instance Name
</div>

Фильтры

Если вам нужно применить фильтры к выходному значению тега шаблона, добавьте цитируемую последовательность фильтров, как в теге шаблона Django filter:

{% load cms_tags %}

{% block content %}
<h1>{% render_model instance "attribute" "" "" "truncatechars:9" %}</h1>
{% endblock content %}

Контекстная переменная

Вывод тега шаблона может быть сохранен в контекстной переменной для последующего использования, используя стандартный синтаксис as:

{% load cms_tags %}

{% block content %}
{% render_model instance "attribute" as variable %}

<h1>{{ variable }}</h1>

{% endblock content %}
Вернуться на верх