Django CMS自定义插件从cms_title加载数据

时间:2016-07-14 09:59:48

标签: python django django-cms

我想为Django CMS创建一个自定义插件。正如guide所示,我创建了一些示例。但现在的目标是创建一个从(mysql)数据库获取数据的插件。它将加载属于菜单的所有标题,因为我想要一些类似于目录。

要从自定义模型中获取数据,代码如下:

  • models.py:

    from cms.models.pluginmodel import CMSPlugin
    
    from django.db import models
    
    class Hello(CMSPlugin):
    
        guest_name = models.CharField(max_length=50, default='Guest')
    
  • cms_plugins.py

来自cms.plugin_base导入CMSPluginBase

from cms.plugin_pool import plugin_pool

from django.utils.translation import ugettext_lazy as _
from .models import Hello

class HelloPlugin(CMSPluginBase):
    model = Hello
    name = _("Hello Plugin")
    render_template = "hello_plugin.html"
    cache = False

    def render(self, context, instance, placeholder):
        context = super(HelloPlugin, self).render(context, instance, placeholder)
        return context

plugin_pool.register_plugin(HelloPlugin)

但是由于cms_title默认属于Django-CMS,这里可以选择哪些选项?我在哪里可以找到名称为Title的CMS模型的定义?将它设置为CMSPlugin实例会是一个坏方法吗?

1 个答案:

答案 0 :(得分:0)

好吧,经过几个小时的挣扎,我终于成功解决了我的问题。

首先,用CMS模型和参数标题回答部分问题(在db:cms_title中)。使用FK到CMS标题创建新模型是正确的方法。 在 models.py

class TitlePlugin(CMSPlugin):
        title = models.ForeignKey(Title)

接下来,您需要将其导入 cms_plugins.py ,因此它将如下所示:

from .models import TitlePlugin

 class MyTitlePluginClass(CMSPluginBase):
    model = TitlePlugin
    render_template = "titles.html"
    cache = False

如您所见,我们加载的模型是TitlePlugin,我们在models.py中定义(其中FK为原始cms_title)。

现在,渲染它:

def render(self, context, instance, placeholder):

    context = super(MyTitlePluginClass, self).render(context, instance, placeholder)
    return context

但我的目标是将其加载到模板中以用于目录'对吧?所以我不得不改变一些事情。

我删除了models.py内容(不需要!)

新的cms_plugins.py也进行了修改: 的第一

from cms.models.pagemodel import Page
#we import the Page model

和更新的课程:

class MyTitlePluginClass(CMSPluginBase):
    model = CMSPlugin
    render_template = "titles.html"
    cache = False

def render(self, context, instance, placeholder):
    pages = Page.objects.filter(in_navigation=True, publisher_is_draft=False)

    #context = {
    #'pages' : pages,
    #}
    # edit: append to 'pages' existing list!
    context['pages'] = pages

    context = super(MyTitlePluginClass, self).render(context, instance, placeholder)
    return context

plugin_pool.register_plugin(MyTitlePluginClass)

在模板中,我们只需使用for循环打印它 的 titles.html

{% for page in pages %}
<div class="panel callout ">
    {{ page }}
</div>
{% endfor %}