4. Плагины¶
В этом руководстве мы рассмотрим базовое приложение для опроса общественного мнения на Django и интегрируем его в CMS.
4.1. Создание модели плагина¶
В models.py
из polls_cms_integration
добавьте следующее:
from django.db import models
from cms.models import CMSPlugin
from polls.models import Poll
class PollPluginModel(CMSPlugin):
poll = models.ForeignKey(Poll, on_delete=models.CASCADE)
def __str__(self):
return self.poll.question
Это создает класс модели плагина; все они наследуются от базового класса cms.models.pluginmodel.CMSPlugin
.
Примечание
Плагины django CMS наследуются от cms.models.pluginmodel.CMSPlugin
(или его подкласса), а не от models.Model
.
Создание и запуск миграций:
python manage.py makemigrations polls_cms_integration
python manage.py migrate polls_cms_integration
4.1.1. Класс плагина¶
Теперь создайте новый файл cms_plugins.py
в той же папке, в которой находится ваш models.py
. Класс plugin отвечает за предоставление django CMS необходимой информации для рендеринга вашего плагина.
Для нашего плагина опроса мы напишем следующий класс плагина:
from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from polls_cms_integration.models import PollPluginModel
from django.utils.translation import gettext as _
@plugin_pool.register_plugin # register the plugin
class PollPluginPublisher(CMSPluginBase):
model = PollPluginModel # model where plugin data are saved
module = _("Polls")
name = _("Poll Plugin") # name of the plugin in the interface
render_template = "polls_cms_integration/poll_plugin.html"
def render(self, context, instance, placeholder):
context.update({'instance': instance})
return context
Примечание
Все классы плагинов должны наследоваться от cms.plugin_base.CMSPluginBase
и должны регистрировать себя в plugin_pool
.
Разумным соглашением для именования плагинов является следующее:
PollPluginModel
: класс модель.PollPluginPublisher
: класс plugin.
Вам не обязательно следовать этим правилам, но выберите то, которое имеет смысл, и придерживайтесь его.
4.1.2. Шаблон¶
Атрибут render_template
в классе плагина является обязательным и указывает плагину, какой render_template
использовать при рендеринге.
В этом случае шаблон должен находиться по адресу polls_cms_integration/templates/polls_cms_integration/poll_plugin.html
и выглядеть примерно так:
<h1>{{ instance.poll.question }}</h1>
<form action="{% url 'polls:vote' instance.poll.id %}" method="post">
{% csrf_token %}
<div class="form-group">
{% for choice in instance.poll.choice_set.all %}
<div class="radio">
<label>
<input type="radio" name="choice" value="{{ choice.id }}">
{{ choice.choice_text }}
</label>
</div>
{% endfor %}
</div>
<input type="submit" value="Vote" />
</form>
4.2. Протестируйте плагин¶
Теперь вы можете перезапустить runserver (это необходимо, поскольку вы добавили новый файл cms_plugins.py
, и посетить http://localhost:8000/.
Теперь вы можете поместить Poll Plugin
в любое место на любой странице, как и любой другой плагин.
Далее мы более полно интегрируем приложение Polls в наш проект django CMS.