我正在为客户端创建一个django-cms网站。我想这样做:使用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
的现有图片。
有没有办法做到这一点?
您现在处于正确的轨道上,只要有需要的插件就可以使用filer。并使它更好,你可以使用CMS_PLACEHOLDER_CONF
setting只允许一个插件为背景图像占位符内占位符,就像这样:
CMS_PLACEHOLDER_CONF = {
'background-image': {
"plugins": ('YourImagePlugin',),
'name':"Background Image",
'limits': {
'global': 1,
},
},
}
保罗是正确的,第一步是配置一个占位符,这样它最多只能使用一个图像插件,在这种情况下,最多只能使用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 %}
>
很好的答案Flimm,谢谢!
但是,我在上下文处理器中发现一个错误,指出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
占位符需要位于未呈现的位置。
这只是解决方案的一半。另一半是如何获得图片网址? '{%placeholder backround-image%}'会呈现一个'
'标签,这不是这里所需要的,只是网址。 –
Flimm
我想我误解了这个问题:)。而不是基于插件的方法,最好为此使用页面扩展。 – Paulo