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

时间:2014-11-20 17:01:40

标签: python django plugins placeholder django-cms

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

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

我知道有来自cms.api的add_plugin,但我仍然需要找到一种方法将PlaceholderField转换为占位符以使其正常工作。

这是我现在的代码。

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 个答案:

答案 0 :(得分:0)

PlaceholderField只是一个ForeignKey,可以在创建新实例时自动创建与新Placeholder对象的关系。

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