我正在为客户创建一个 django-cms 站点。我想做类似的事情:
<body style="background-image:url({% placeholder background-image %});">
想要的效果是有一个地方,CMS 的用户可以为页面选择背景图像。理想情况下,他们会使用类似Filer
.
有没有办法做到这一点?
我正在为客户创建一个 django-cms 站点。我想做类似的事情:
<body style="background-image:url({% placeholder background-image %});">
想要的效果是有一个地方,CMS 的用户可以为页面选择背景图像。理想情况下,他们会使用类似Filer
.
有没有办法做到这一点?
Paulo 是对的,第一步是配置一个占位符,使其最多只能使用一个图像插件,在这种情况下,FileImagePlugin
. 通过修改CMS_PLACEHOLDER_CONF来做到这一点:
CMS_PLACEHOLDER_CONF = {
'cover_image': {
'plugins': ['FilerImagePlugin'],
'name': _('Cover Image'),
'limits': {'global': 1},
},
}
确保在您的模板中,您在某处显示此占位符:
{% load cms_tags %}
{% placeholder "cover_image" %}
<img>
这将在标签中呈现图像。但是,如果您只想要图像的 URL 怎么办?这就是第二步。
创建一个上下文处理器,它将直接为您提供图像。详细信息将根据您使用的图像插件进行修改,但这是我使用的:
# in context_processors.py
from cms.models.pluginmodel import CMSPlugin
def page_extra(request):
page = request.current_page
if page:
cover_image_plugin = CMSPlugin.objects.filter(
placeholder__page=page,
placeholder__slot='cover_image',
plugin_type='FilerImagePlugin',
).first()
if cover_image_plugin:
return {'cover': cover_image_plugin.filerimage.image}
return {}
请记住在您的settings.py
文件中安装上下文处理器:
TEMPLATES[0]['OPTIONS']['context_processors'].append('example.context_processors.page_extra')
现在在您的模板中,您可以使用 访问 URL cover.url
,如下所示:
<body
{% if cover %}
style="background-image: url('{{ cover.url|urlencode }}')"
{% endif %}
>
很好的答案弗利姆,谢谢!
但是,我在上下文处理器中收到一个错误,指出CMSPlugin
对象没有filerimage
属性。这是适用于我的上下文处理器:
# in context_processors.py
from cms.models.pluginmodel import CMSPlugin
def cover_image(request):
page = request.current_page
if page:
cover_image_plugin = CMSPlugin.objects.filter(
placeholder__page=page,
placeholder__slot='cover_image',
plugin_type='FilerImagePlugin',
).first()
if cover_image_plugin:
return {'cover': cover_image_plugin.get_plugin_instance()[0]}
return {}
注意最后一行的变化。get_plugin_instance
检索正确子类化的实例对象作为元组的第一个条目。(我使用 Django CMS 3.4)
最后一点,cover_image
占位符需要位于未呈现的位置。
你走在正确的轨道上,一旦你需要的是插件,在这种情况下你可以使用文件管理器。为了使它更好,您可以使用该CMS_PLACEHOLDER_CONF
设置仅允许一个插件作为背景图像占位符内的占位符,如下所示:
CMS_PLACEHOLDER_CONF = {
'background-image': {
"plugins": ('YourImagePlugin', ),
'name':"Background Image",
'limits': {
'global': 1,
},
},
}