在实施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>
渲染框
插件编辑对话框如下所示:
答案 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插件。这对于新闻应用或博客风格内容等非常有用。