带有可编辑链接元素

时间:2017-02-02 07:38:35

标签: django django-cms

在实施Django CMS网站时,我对链接管理(内部或外部)有点困惑。在我的项目中,我有一个特定的盒子插件,操作员经常使用它。我在问题的最后添加了编辑对话框和框渲染的截图。

编辑对话框很不错,但是现在按钮只是一个char字段。因此,缺少对Django CMS中的页面或外部URL的链接选择。我找了一个链接字段,但直到现在我迷路了。

如何添加功能以让操作员选择内部或外部链接?

该插件由以下部分组成:

models.py

from django.db import models
from cms.models.pluginmodel import CMSPlugin
from djangocms_text_ckeditor.fields import HTMLField

class CardPlugin(CMSPlugin):
    title = models.CharField(max_length=256,default='')
    description = HTMLField(configuration='CKEDITOR_SETTINGS',
                            default='')
    button = models.CharField(max_length=256,default='')

    def __str__(self):
        return str(self.title)

cms_plugins.py

class CardCMSPlugin(CMSPluginBase):
    model = CardPlugin
    name = 'Card'
    render_template = "card-default.html"

卡default.html中

{% load cms_tags %}
<section class="card card--primary-light">
  <div class="card__inner">
    <div class="card__content">
      <div class="card__text">
        <h2 class="card__title">
            {{ instance.title }}
        </h2>
        <p class="card__description">
            {{ instance.description }}
        </p>
      </div>
      {% if instance.button %}
      <div class="card__buttons">
            <a href="#0" class="button button--primary-inverse">{{ instance.button }}</a>
      </div>
      {% endif %}
    </div>
  </div>
</section>

渲染框

The rendered box

插件编辑对话框如下所示:

the plugin edit dialog

1 个答案:

答案 0 :(得分:4)

我建议将djangocms-link插件添加为子插件。这是一个非常好的插件链接到内部CMS页面或外部地址。这样您就可以从模型中删除button字段,而是在模板中渲染子插件。

nested plugins上的文档将是一本很好的读物。

您的插件定义会变成这样;

class ParentCMSPlugin(CMSPluginBase):
    render_template = 'parent.html'
    name = 'Parent'
    model = ParentPlugin
    allow_children = True
    child_classes = ['LinkPlugin']

要渲染子插件,您可以使用模板执行此操作;

{% load cms_tags %}
<section class="card card--primary-light">
    <div class="card__inner">
        <div class="card__content">
            <div class="card__text">
                <h2 class="card__title">
                    {{ instance.title }}
                </h2>
                <p class="card__description">
                    {{ instance.description }}
                </p>
            </div>
            {% for plugin in instance.child_plugin_instances %}
                {% render_plugin plugin %}
            {% endfor %}
        </div>
    </div>
</section>

这将使用子插件的默认渲染模板。如果默认设置与样式等不匹配,则可以在模板中处理渲染,而不是使用render_plugin或将LinkPlugin子类化为您想要的工作方式,或者扩展它的属性等。

应该进一步考虑删除你的描述字段,同时也使用TextPlugin作为孩子,因为CMS文本插件可以在其自身内嵌套插件,而且我总是使用{{{ 1}}。

此外,如果您正在开发连接到CMS的应用程序,请查看PlaceholderFields,它允许您在自己的模型中创建占位符以容纳&amp;使用可在CMS页面中使用的CMS插件。这对于新闻应用或博客风格内容等非常有用。