【问题标题】:Using django-cms, how can I allow the user to specify a background image使用 django-cms,如何允许用户指定背景图像
【发布时间】:2013-07-19 05:22:28
【问题描述】:

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

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

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

有没有办法做到这一点?

【问题讨论】:

    标签: django-cms


    【解决方案1】:

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

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

    【讨论】:

    • "作为最后一点,cover_image 占位符需要位于未渲染的位置。" - 那么它应该在哪里?
    • @DmitriyVinokurov 例如,将其放入&lt;div style="displkay: none;"&gt; ... &lt;/div&gt;。这样可以避免双重渲染。
    【解决方案2】:

    Paulo 是对的,第一步是配置一个占位符,使其最多只能使用一个图像插件,在这种情况下,FileImagePlugin。通过修改CMS_PLACEHOLDER_CONF来做到这一点:

    CMS_PLACEHOLDER_CONF = {
        'cover_image': {
            'plugins': ['FilerImagePlugin'],
            'name': _('Cover Image'),
            'limits': {'global': 1},
        },
    }
    

    确保在您的模板中,您在某处显示此占位符:

    {% load cms_tags %}
    {% placeholder "cover_image" %}
    

    这将在&lt;img&gt; 标记中呈现图像。但是,如果您只想要图像的 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 %}
    >
    

    【讨论】:

    • 我应该在哪里放置 "{% placeholder "cover_image" %}" 标签? “cover.url|urlencode”对我来说是空的。
    【解决方案3】:

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

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

    【讨论】:

    • 这只是解决方案的一半。另一半是如何只获取图像 URL? {% placeholder backround-image %} 会渲染一个&lt;img&gt; 标签,这不是这里需要的,只是URL。
    • 我想我误解了这个问题:)。与其使用基于插件的方法,不如为此使用页面扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    相关资源
    最近更新 更多