2013-07-19 31 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佔位符需要位於未呈現的位置。