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
相关产品推荐
相关产品推荐

