5

我正在为客户创建一个 django-cms 站点。我想做类似的事情:

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

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

有没有办法做到这一点?

4

3 回答 3

3

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 %}
>
于 2016-08-15T15:31:30.143 回答
2

很好的答案弗利姆,谢谢!

但是,我在上下文处理器中收到一个错误,指出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占位符需要位于未呈现的位置。

于 2016-09-28T15:20:50.300 回答
0

你走在正确的轨道上,一旦你需要的是插件,在这种情况下你可以使用文件管理器。为了使它更好,您可以使用该CMS_PLACEHOLDER_CONF设置仅允许一个插件作为背景图像占位符内的占位符,如下所示:

CMS_PLACEHOLDER_CONF = {
    'background-image': {
        "plugins": ('YourImagePlugin', ),
        'name':"Background Image",
        'limits': {
            'global': 1,
        },
    },
}
于 2013-07-21T18:56:01.963 回答