从代码中将 cms 插件添加到占位符

Posted

技术标签:

【中文标题】从代码中将 cms 插件添加到占位符【英文标题】:Adding a cms plugin to a placeholder from code 【发布时间】:2015-01-18 15:38:09 【问题描述】:

我正在尝试从代码中将插件添加到 PlaceholderField。 我有一个包含几个字段的模型(问题),其中一个是 PlaceholderField。

我想要做的是向该占位符字段添加一个 TextPugin(或任何其他通用 cms_plugin)。这是必需的,因为我不希望人们从 cms 的前端编辑模式手动添加 TextPlugin,而是自己创建它,以便他们可以在之后添加正确的内容。

我知道 cms.api 中有 add_plugin,但我仍然需要想办法将 PlaceholderField 转换为 Placeholder 才能正常工作。

这是我现在的代码。

models.py

from django.utils.translation import ugettext as _
from django.db import models
from djangocms_text_ckeditor.cms_plugins import TextPlugin
from cms.models.fields import PlaceholderField
from cms.api import add_plugin

class Question(models.Model):
    topic = models.ForeignKey('Topic')
    question = models.CharField(_("Question"),max_length=256)
    answer = PlaceholderField ('Answer plugin')
    priorityOrder = models.IntegerField(_("Priority Order"))

    def save(self, *args, **kwargs):        

        # Here's the critical point: I can cast self.answer to PlaceholderField, 
        # but I can't cast it to a Placeholder or add a placeholder to it

        add_plugin( ????, plugin_type='TextPlugin', language='us',)
        super(Question, self).save(*args, **kwargs)

    # set the correct name of a django.model object in the admin site
    def __unicode__(self):
        return self.question

class Topic(models.Model):
    title = models.CharField(_("Topic title"),max_length=256)
    priorityOrder = models.IntegerField(_("Priority Order"))

    # set the correct name of a django.model object in the admin site
    def __unicode__(self):
        return self.title

非常欢迎任何帮助(包括其他方法)!

【问题讨论】:

【参考方案1】:

PlaceholderField 只不过是 ForeignKey,它会在创建新实例时自动创建与新 Placeholder 对象的关系。

因此,您不能在未保存的实例上的PlaceholderField 上使用add_plugin。您需要先致电super().save(),然后再致电add_plugin(self.answer, ...)

【讨论】:

以上是关于从代码中将 cms 插件添加到占位符的主要内容,如果未能解决你的问题,请参考以下文章

django cms 占位符不在结构视图中

cms 之外的 Django CMS 简单占位符

截断 Django CMS 占位符

Django CMS 自动显示正确的占位符插件

Django CMS Group/Nest 占位符

在不同的占位符/模板上以不同的方式呈现 Django-CMS 插件