具有可编辑 link 元素的插件

Plugin with editable link element

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

编辑对话框很好,但现在按钮只是一个字符字段。因此 link selection,无论是 Django CMS 中的页面还是外部 URL,都丢失了。我找了一个 link 字段,但直到现在我都迷路了。

如何添加让操作员 select 内部或外部 link 的功能?

插件由以下部分组成:

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>

渲染框

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

我建议考虑将 djangocms-link 插件添加为子插件。这是 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 文本插件可以在自身内嵌套插件,这是我经常使用的东西HTMLField.

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