【发布时间】:2013-07-19 05:22:28
【问题描述】:
我正在为客户创建一个 django-cms 站点。我想做类似的事情:
<body style="background-image:url({% placeholder background-image %});">
想要的效果是有一个地方,CMS 的用户可以为页面选择背景图像。理想情况下,他们会选择使用 Filer 之类的现有图片。
有没有办法做到这一点?
【问题讨论】:
标签: django-cms
我正在为客户创建一个 django-cms 站点。我想做类似的事情:
<body style="background-image:url({% placeholder background-image %});">
想要的效果是有一个地方,CMS 的用户可以为页面选择背景图像。理想情况下,他们会选择使用 Filer 之类的现有图片。
有没有办法做到这一点?
【问题讨论】:
标签: django-cms
很好的回答弗利姆,谢谢!
但是,我在上下文处理器中收到错误消息,指出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 占位符需要位于未呈现的位置。
【讨论】:
<div style="displkay: none;"> ... </div>。这样可以避免双重渲染。
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')
现在在您的模板中,您可以使用 cover.url 访问 URL,如下所示:
<body
{% if cover %}
style="background-image: url('{{ cover.url|urlencode }}')"
{% endif %}
>
【讨论】:
你走在正确的轨道上,一旦你需要的是插件,在这种情况下你可以使用文件管理器。为了使它更好,您可以使用CMS_PLACEHOLDER_CONF setting 仅允许该插件作为背景图像占位符内的占位符,如下所示:
CMS_PLACEHOLDER_CONF = {
'background-image': {
"plugins": ('YourImagePlugin', ),
'name':"Background Image",
'limits': {
'global': 1,
},
},
}
【讨论】:
{% placeholder backround-image %} 会渲染一个<img> 标签,这不是这里需要的,只是URL。