Django CMS - 检查占位符是否为空

时间:2013-06-17 12:40:19

标签: python html django django-cms

我用:

  • DjangoCMS 2.4
  • Django 1.5.1
  • Python 2.7.3

我想检查我的占位符是否为空。

<div>
    {% placeholder "my_placeholder" or %}
    {% endplaceholder %}
</div>

如果占位符为空,我不希望在占位符之间创建html。

{% if placeholder "my_placeholder" %}
<div>
    {% placeholder "my_placeholder" or %}
    {% endplaceholder %}
</div>
{% endif %}

5 个答案:

答案 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 %}

它在我的djangocms-misc package