DjangoCMS 4中扩展LinkPluginMixin自定义插件报错排查
Django CMS自定义插件复用链接功能报错解决
问题描述
我想开发一个自定义Django CMS插件,复用djangocms_frontend中LinkPlugin的链接功能。参考Bootstrap插件的实现方式,尝试结合LinkPluginMixin添加自定义字段(header1、header2),编写了如下代码:
模型文件(bla/models.py)
class Bla(GetLinkMixin, FrontendUIItem): header1 = models.CharField(max_length=50, default='') header2 = models.CharField(max_length=50, default='')
插件文件(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.
错误原因及解决方法
核心错误是:GetLinkMixin仅提供链接相关的逻辑方法,并未在模型中添加对应的数据库字段,但你在插件的fieldsets中直接引用了这些不存在的字段,因此触发字段不存在的报错。
正确做法是让模型继承LinkMixin(而非GetLinkMixin),LinkMixin会自动为模型添加external_link、internal_link、mailto、phone、anchor、target等所需的数据库字段。
修改后的模型代码:
from djangocms_frontend.models import FrontendUIItem from djangocms_frontend.contrib.link.models import LinkMixin class Bla(LinkMixin, FrontendUIItem): header1 = models.CharField(max_length=50, default='') header2 = models.CharField(max_length=50, default='')
修改完成后重新执行数据库迁移:
python manage.py makemigrations python manage.py migrate
此时模型已拥有链接功能所需的全部字段,插件的fieldsets配置可正常识别这些字段,报错问题即可解决。
内容的提问来源于stack exchange,提问作者andzep
相关产品推荐
相关产品推荐

