Django CMS - Пример расширения CMS

12 April 2014 г. 15:46:53

В этом разделе предполагается что вы уже о ознакомились с руководством по Django и будет показано как интегрировать программу голосования, из руководства, в django CMS. Если в дальнейшем будет упоминаться голосование, то это будет ссылка на руководство по Django. Так же убедитесь что приложение голосования добавлено в секцию INSTALLED_APPS.

1.1 Мой первый плагин

1.1.1 Модель

1.1.2 Класс Plugin

1.1.3 Шаблоны

1.2 Мое первое приложение (связывание приложений)

1.3 Мое первое меню

Таким образом ваш файл urls.py будет приблизительно выглядеть так:

from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^admin/', include(admin.site.urls)),
(r'^polls/', include('polls.urls')),
(r'^', include('cms.urls')),
)

1.1 Мой первый плагин

Плагин это небольшая часть контента, которая помещается на вашу страницу

1.1.1 Модель

Для вашего приложения голосования мы хотим создать небольшой плагин, которые показывает голосование и позволяет пользователям голосовать.

В приложении голосования models.py будет выглядеть так:

from cms.models import CMSPlugin
class PollPlugin(CMSPlugin):
poll = models.ForeignKey('polls.Poll', related_name='plugins')
def __unicode__(self):
return self.poll.question

Замечание

В django CMS все плагины вместо models.Model должны наследоваться от cms.models.CMSPlugin

Выполните manage.py syncdb для создания таблиц в базе данных для этой модели. Больше информации можно найти в статье http://cultofdigits.com/articles/django-cms/2-ispolzovanie-south-v-django-cms/

1.1.2 Класс Plugin

Теперь создайте файл cms_plugins.py в той же директории в которой находится models.py. После всех Ваших изменений директорий должен выглядеть следующим образом:

polls/
__init__.py
cms_plugins.py
models.py
tests.py
views.py

Класс plugin отвечает за предоставление информации для django CMS, когда необходимо получить информацию для отрисовки вашего плагина.

Для плагина голосования класс plugin должен выглядеть следующим образом:

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from polls.models import PollPlugin as PollPluginModel
from django.utils.translation import ugettext as _
class PollPlugin(CMSPluginBase):
model = PollPluginModel # Model where data about this plugin is saved
name = _("Poll Plugin") # Name of the plugin
render_template = "polls/plugin.html" # template to render the plugin with
def render(self, context, instance, placeholder):
context.update({'instance':instance})
return context
plugin_pool.register_plugin(PollPlugin) # register the plugin

Замечание

Все классы которые создают плагины должны наследоваться от cms.plugin_base.CMSPluginBase и так-же должны быть зарегистрированы при помощи cms.plugin_pool.plugin_pool.

1.1.3 Шаблоны

Возможно вы заметили атрибут render_template в классе плагина описанным выше. Для работы нашего плашина этот шаблон должен существовать и должен отвечать за обрисовку плагина.

Шаблон должен выглядеть приблизительно так:

<h1>{{ instance.poll.question }}</h1>
<form action="{% url polls.views.vote instance.poll.id %}" method="post">
{% csrf_token %}
{% for choice in instance.poll.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
<label for="choice{{ forloop.counter }}">{{ choice.choice }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

Замечание

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

1.2 Мое первое приложение (связывание приложений)

Прямо сейчас внешние приложение связывается статически в файле urls.py. В django CMS это не является желательным методом. Идеальный способ это связывание приложения на ваших страницах внутри CMS.

Для этого необходимо создать CMSApp. Это всего лишь небольшой класс который сообщает как приложение должно быть включено в CMS.

Приложения находится в файле под названием cms_app.py, поэтому давайте создадим внутри приложения голосования файл приложения:

polls/
__init__.py
cms_app.py
cms_plugins.py
models.py
tests.py
views.py

Внутри этого файла поместите следующее:

from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from django.utils.translation import ugettext_lazy as _
class PollsApp(CMSApp):
name = _("Poll App") # give your app a name, this is required
urls = ["polls.urls"] # link your app to url configuration(s)
apphook_pool.register(PollsApp) # register your app

Теперь можно удалить из файла urls.py ссылку на приложение голосования, и он будет выглядеть следующим образом

from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^admin/', include(admin.site.urls)),
(r'^', include('cms.urls')),
)

Теперь откройте панель администратора и вашем браузере и отредактируйте страницу. Откройте вкладку ‘Advanced Settings и выберите для вашего приложения Polls App.

К сожалению для того чтобы эти изменения вступили в силу Вам придется перезагрузить сервер. Сделайте это и после этого перейдите на страницу и вы уведете ваше приложение для голосования.

1.3 Мое первое меню

Возможно Вы заметили что дерево меню останавливается на последнем шаге. Поэтому давайте создадим меню которое показывает узел для каждого активного приложения голосования.

Для этого нам надо создать файл menu.py. Создайте его и убедитесь что ваше приложения голосования выглядит следующим образом:

polls/
__init__.py
cms_app.py
cms_plugins.py
menu.py
models.py
tests.py
views.py

В файле menu.py добавьте следующее содержание:

from cms.menu_bases import CMSAttachMenu
from menus.base import Menu, NavigationNode
from menus.menu_pool import menu_pool
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from polls.models import Poll
class PollsMenu(CMSAttachMenu):
name = _("Polls Menu") # give the menu a name, this is required.
def get_nodes(self, request):
"""
This method is used to build the menu tree.
"""
nodes = []
for poll in Poll.objects.all():
# the menu tree consists of NavigationNode instances
# Each NavigationNode takes a label as its first argument, a URL as
# its second argument and a (for this tree) unique id as its third
# argument.
node = NavigationNode(
poll.question,
reverse('polls.views.detail', args=(poll.pk,)),
poll.pk
)
nodes.append(node)
return nodes
menu_pool.register_menu(PollsMenu) # register the menu.

На данном этапе это меню не делает много. Мы должны в первую очередь связать его с нашим приложениям.

Поэтому откройте файл cms_apps.py и добавьте стелющее:

from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from polls.menu import PollsMenu
from django.utils.translation import ugettext_lazy as _
class PollsApp(CMSApp):
name = _("Poll App")
urls = ["polls.urls"]
menus = [PollsMenu] # attach a CMSAttachMenu to this apphook.
apphook_pool.register(PollsApp)

Оставьте свой комментарий

comments powered by Disqus
Меню

Cult of digits 2014 Яндекс.Метрика