• en
  • Language: ru
  • 3.7.x
  • Documentation version: 3.9

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 в любое место на любой странице, как и любой другой плагин.

'Плагин Poll' в селекторе плагинов

Далее мы более полно интегрируем приложение Polls в наш проект django CMS.