我正在爲客戶端創建一個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