2013-07-19 97 views
4

我正在为客户端创建一个django-cms网站。我想这样做:使用django-cms,我如何让用户指定背景图片

<body style="background-image:url({% placeholder background-image %});"> 

所需的效果是有一个地方,CMS的用户可以选择背景图片的页面。理想情况下,他们会选择使用类似Filer的现有图片。

有没有办法做到这一点?

回答

0

您现在处于正确的轨道上,只要有需要的插件就可以使用filer。并使它更好,你可以使用CMS_PLACEHOLDER_CONF setting只允许一个插件为背景图像占位符内占位符,就像这样:

CMS_PLACEHOLDER_CONF = { 
    'background-image': { 
     "plugins": ('YourImagePlugin',), 
     'name':"Background Image", 
     'limits': { 
      'global': 1, 
     }, 
    }, 
} 
+0

这只是解决方案的一半。另一半是如何获得图片网址? '{%placeholder backround-image%}'会呈现一个''标签,这不是这里所需要的,只是网址。 – Flimm

+0

我想我误解了这个问题:)。而不是基于插件的方法,最好为此使用页面扩展。 – Paulo

2

保罗是正确的,第一步是配置一个占位符,这样它最多只能使用一个图像插件,在这种情况下,最多只能使用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 %} 
> 
1

很好的答案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占位符需要位于未呈现的位置。