DjangoCMS:如何在占位符中自动添加默认插件
DjangoCMS: how to auto-add default plugins in placeholders
我的 DjangoCMS 模板中有一些占位符(示例、页眉、内容和页脚)。我想自动填充任何带有默认项的新建页面:带有页眉插件的页眉占位符和带有页脚插件的页脚占位符。
如何做到?
这可以使用 CMS_PLACEHOLDER_CONF
设置来完成,特别是 default_plugins
选项:
CMS_PLACEHOLDER_CONF = {
'footer': {
'name': "Footer",
'default_plugins':[
{
'plugin_type':'FooterPlugin',
'values':{
'body':'<p>This is the footer</p>'
},
},
]
},
}
这假设您的 FooterPlugin
有一个字段 body
允许 HTML 内容。
还有一个提示:静态占位符很适合这个目的。
这是对 Adam Venturella 上面的问题(关于带外键的插件)的回应,因为我不得不解决同样的问题......迟到总比不到好(也许)
在深入了解源代码后,我发现在添加名为 notify_on_autoadd
的默认插件后,您可以将其添加到 CMSPlugin
中。它的签名是 notify_on_autoadd(self, request, conf)
其中 conf
是包含 plugin_type
、values
等的字典...所以我添加了我想要的额外外键作为新键那里(它不会在 values
键中工作,因为它作为字段值逐字传递以生成 CMSPlugin
,但您可以将它添加到根目录中)...然后在 notify_on_autoadd
我只是从这个 conf
.
中像往常一样创建新条目
这是一个更清楚的例子:
class Story(CMSPlugin):
title = models.CharField(max_length=32)
def notify_on_autoadd(self, request, conf):
new_line_values = conf.get('new_line_values', [])
for vals in new_line_values:
line = Line(
fmt=vals.get('fmt', '')
text=vals.get('text', ''),
story=self
)
line.save()
def __str__(self):
return self.title
class Line(models.Model):
fmt = models.CharField(max_length=8)
text = models.TextField()
story = models.ForeignKey(Story, related_name='story')
def __str__(self):
return self.heading
然后您只需将类似此代码段的内容添加到您的 CMS_PLACEHOLDER_CONF
。
CMS_PLACEHOLDER_CONF = {
...
'default_plugins': [
{
'plugin_type': 'StoryPlugin',
'values': {
'title': 'My Story',
},
'new_line_values': [
{
'fmt': 'normal',
'text': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
},
{
'fmt': 'bold',
'text': 'Everyone is sick of Lorem Ipsum !',
},
]
},
],
...
}
无论如何,我希望这能帮助寻找同样东西的人(我假设 Adam Venturella 现在已经离开了)
我的 DjangoCMS 模板中有一些占位符(示例、页眉、内容和页脚)。我想自动填充任何带有默认项的新建页面:带有页眉插件的页眉占位符和带有页脚插件的页脚占位符。
如何做到?
这可以使用 CMS_PLACEHOLDER_CONF
设置来完成,特别是 default_plugins
选项:
CMS_PLACEHOLDER_CONF = {
'footer': {
'name': "Footer",
'default_plugins':[
{
'plugin_type':'FooterPlugin',
'values':{
'body':'<p>This is the footer</p>'
},
},
]
},
}
这假设您的 FooterPlugin
有一个字段 body
允许 HTML 内容。
还有一个提示:静态占位符很适合这个目的。
这是对 Adam Venturella 上面的问题(关于带外键的插件)的回应,因为我不得不解决同样的问题......迟到总比不到好(也许)
在深入了解源代码后,我发现在添加名为 notify_on_autoadd
的默认插件后,您可以将其添加到 CMSPlugin
中。它的签名是 notify_on_autoadd(self, request, conf)
其中 conf
是包含 plugin_type
、values
等的字典...所以我添加了我想要的额外外键作为新键那里(它不会在 values
键中工作,因为它作为字段值逐字传递以生成 CMSPlugin
,但您可以将它添加到根目录中)...然后在 notify_on_autoadd
我只是从这个 conf
.
这是一个更清楚的例子:
class Story(CMSPlugin):
title = models.CharField(max_length=32)
def notify_on_autoadd(self, request, conf):
new_line_values = conf.get('new_line_values', [])
for vals in new_line_values:
line = Line(
fmt=vals.get('fmt', '')
text=vals.get('text', ''),
story=self
)
line.save()
def __str__(self):
return self.title
class Line(models.Model):
fmt = models.CharField(max_length=8)
text = models.TextField()
story = models.ForeignKey(Story, related_name='story')
def __str__(self):
return self.heading
然后您只需将类似此代码段的内容添加到您的 CMS_PLACEHOLDER_CONF
。
CMS_PLACEHOLDER_CONF = {
...
'default_plugins': [
{
'plugin_type': 'StoryPlugin',
'values': {
'title': 'My Story',
},
'new_line_values': [
{
'fmt': 'normal',
'text': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
},
{
'fmt': 'bold',
'text': 'Everyone is sick of Lorem Ipsum !',
},
]
},
],
...
}
无论如何,我希望这能帮助寻找同样东西的人(我假设 Adam Venturella 现在已经离开了)