我用:
我想检查我的占位符是否为空。
<div>
{% placeholder "my_placeholder" or %}
{% endplaceholder %}
</div>
如果占位符为空,我不希望在占位符之间创建html。
{% if placeholder "my_placeholder" %}
<div>
{% placeholder "my_placeholder" or %}
{% endplaceholder %}
</div>
{% endif %}
答案 0 :(得分:16)
目前在django-cms中没有内置方法可以执行此操作,因此您必须编写自定义模板标记。 django-cms
Google小组上有一些关于此问题的旧讨论:
根据第一次讨论中的代码,我将以下要点放在一起:
我这样使用它:
{% load extra_cms_tags %}
{% get_placeholder "My Placeholder" as my_placeholder %}
{% if my_placeholder %}
<div>
{{ my_placeholder }}
</div>
{% endif %}
答案 1 :(得分:3)
这是一个非常紧凑的解决方案。
模板过滤器:
@register.filter('placeholder_is_empty')
def placeholder_is_empty(request, slot):
page = request.current_page
placeholder = page.placeholders.get(slot=slot)
return placeholder.cmsplugin_set.exists()
模板中的用法:
{% if request|placeholder_is_empty:'myplaceholder' %}
<h1>Here comes some content... </h1>
{% endif %}
答案 2 :(得分:3)
如果您希望在占位符为空的情况下显示其他内容,请使用or
参数和其他{% endplaceholder %}
结束标记。如果占位符没有插件或插件不生成任何输出,则会呈现{% placeholder "..." or %}
和{% endplaceholder %}
之间的所有内容。
示例:
{% placeholder "content" or %}
There is no content.
{% endplaceholder %}
答案 3 :(得分:1)
根据您要实现的目标,如果没有使用:empty选择器的内容,您可以使用CSS隐藏元素。如果您担心空格,可以使用Django的内置{% spaceless %}模板标记将其删除。
所以你得到这个模板:
{% spaceless %}
<div class="hide_if_empty">
{% placeholder "my_placeholder" %}
</div>
{% endspaceless %}
这个CSS:
hide_if_empty:empty {
display: none;
}
并不完全是因为它没有删除HTML - 但这将解决最常见的情况,即人们想要检查占位符是否为空,并且不需要引入一个新的模板标签。
答案 4 :(得分:0)
基于出色的答案形式@Philip Zedler,该解决方案既适用于django-cms页面上的占位符,也适用于“ cms之外”的占位符。
@register.filter()
def placeholder_empty(page_placeholder, slot=None):
"""
for page/slot, pass a page object, and a slot name:
{% if request.current_page|djangocms_misc_placeholder_empty:"content" %}
for a outside page placeholder, just the placeholder object:
{% if object.placeholderfield|djangocms_misc_placeholder_empty %}
also, with:
{% with ph_empty=object.placeholderfield|djangocms_misc_placeholder_empty %}
"""
placeholder = None
if isinstance(page_placeholder, Placeholder):
placeholder = page_placeholder
elif isinstance(page_placeholder, Page):
page = page_placeholder
try:
placeholder = page.placeholders.get(slot=slot)
except Placeholder.DoesNotExist:
pass
if placeholder:
# // return not placeholder.cmsplugin_set.filter(language=get_language()).exists()
return not placeholder.cmsplugin_set.exists()
return False
在模板中使用
{% if request.current_page|placeholder_empty:'content' %}
<h1>Fallback!</h1>
{% endif %}
中