我想制作一个自定义插件,重新使用
djangocms_frontend
中包含的插件的链接功能,例如LinkPlugin
。我找不到类似的示例,所以我试图使其像引导插件之一(来自djangocms_frontend
)。所以,看起来,我应该使用 LinkPluginMixin
和一些额外的字段。
例如,假设我需要一个具有
header1
和 header2
字段以及“启用链接”插件字段的插件。
这是我迄今为止尝试过的:
// on bla/models.py
class Bla(GetLinkMixin, FrontendUIItem):
header1 = models.CharField(max_length=50, default='')
header2 = models.CharField(max_length=50, default='')
// on bla/cms_plugins.py
@plugin_pool.register_plugin
class BlaPlugin(LinkPluginMixin, CMSPluginBase):
model = Bla
module = _('MyModule')
name = _('Bla')
render_template = "bla/bla.html"
allow_children = False
fieldsets = [
(None, {
'fields': ('header1', 'header2')
}),
(
_("Link settings"),
{
"classes": ("collapse",),
"fields": (
("external_link", "internal_link"),
("mailto", "phone"),
("anchor", "target"),
),
},
),
]
迁移运行良好,服务器运行没有错误。但是当我尝试在页面上添加插件的新实例时,我收到错误:
FieldError at /en/admin/cms/placeholder/add-plugin/
Unknown field(s) (phone, external_link, internal_link, anchor, mailto, target) specified for Bla. Check fields/fieldsets/exclude attributes of class BlaPlugin.
那么我做错了什么?
django CMS 前端将其数据存储在 JSON 字段中。当 CSS 框架发生变化时,这很方便,因为更改不需要新的迁移。创建自己的 django CMS 前端插件时,您还必须定义一个表单。链接的字段是从 mixin 中收集的:
# forms.py
from django import forms
from djangocms_frontend.contrib.link.forms import AbstractLinkForm
from entangled.forms import EntangledModelForm
from .models import Bla
class BlaPluginForm(AbstractLinkForm, EntangledModelForm):
class Meta:
model = Bla
entangled_fields = {
"config": [
# No own fields to be stored in the config JSON
]
}
untangled_fields = ("header1", "header1",)
表单的属性
link_is_optional
确定如果未显示链接,表单验证是否会失败。
您还可以通过添加表单字段并将其列在
"config"
元的 entangled_fields
条目中,将要存储在配置 JSON 中的字段添加到表单中。
我还没有测试过,如果有效请告诉我。