You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DjangoCMS插件FAQ仅编辑模式可见,发布页面不显示问题求助

DjangoCMS FAQ插件发布页面无内容问题

问题描述

搭建DjangoCMS的FAQ插件时,编辑模式下可正常显示FAQ内容,但切换至发布页面后内容消失。排查确认:编辑模式下queryset包含FAQ数据,发布模式下queryset为空。

现有代码

models.py

from django.db import models
from cms.models.pluginmodel import CMSPlugin


class FAQPluginModel(CMSPlugin):
    title = models.CharField(max_length=255, default="FAQs")

    def __str__(self):
        return self.title


class FAQItem(models.Model):
    plugin = models.ForeignKey(FAQPluginModel, related_name="faq_items", on_delete=models.CASCADE)
    question = models.CharField(max_length=255)
    answer = models.TextField()

    def __str__(self):
        return self.question

plugins.py

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from django.utils.translation import gettext_lazy as _
from .models import FAQPluginModel
from .admin import FAQPluginModelAdmin, FAQItemInline


class FAQPluginPublisher(CMSPluginBase):
    model = FAQPluginModel
    module = _("FAQs")
    name = _("FAQ Plugin")
    render_template = "faq_plugin.html"
    # render_template = "faq_collapsible.html"
    admin_preview = False
    inlines = [FAQItemInline, ]

    def render(self, context, instance, placeholder):
        context.update({
            'instance': instance,
            'faq_items': instance.faq_items.all(),
        })
        print("faq_items:", context.get('faq_items'))
        return context

plugin_pool.register_plugin(FAQPluginPublisher)

尝试过的无效方案

曾添加以下copy_relations方法,但未解决问题:

def copy_relations(self, oldinstance):
        self.faq_items = oldinstance.faq_items.all()

正确解决方案

问题根源是DjangoCMS发布页面时,关联的FAQItem数据未被正确复制到发布版插件实例中。需修改FAQPluginModel的copy_relations方法,逐个复制关联对象:

class FAQPluginModel(CMSPlugin):
    title = models.CharField(max_length=255, default="FAQs")

    def __str__(self):
        return self.title

    def copy_relations(self, oldinstance):
        # 遍历旧实例的所有FAQItem,逐个创建副本关联到新实例
        for item in oldinstance.faq_items.all():
            FAQItem.objects.create(
                plugin=self,
                question=item.question,
                answer=item.answer
            )

原理说明

DjangoCMS发布页面时会生成插件实例的副本作为发布版本,copy_relations用于处理关联数据复制。直接赋值QuerySet不会创建实际关联对象,必须逐个生成FAQItem副本并绑定到新插件实例,才能让发布版获取到FAQ数据。

修改后执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

重新发布页面后,FAQ内容即可正常显示。


内容的提问来源于stack exchange,提问作者Sid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:07:42