Как включить фронтенд-редактирование для моделей 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 %}