11

我用:

  • 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 %}
4

5 回答 5

17

目前在 django-cms 中没有内置的方法来执行此操作,因此您必须编写自定义模板标签。django-cmsGoogle Group上有一些关于此的旧讨论:

基于第一次讨论中的代码,我整理了以下要点:

我像这样使用它:

{% load extra_cms_tags %}
{% get_placeholder "My Placeholder" as my_placeholder %}

{% if my_placeholder %}
<div>
    {{ my_placeholder }}
</div>
{% endif %}
于 2013-06-17T13:02:54.100 回答
6

如果您希望在占位符为空的情况下显示其他内容,请使用or参数和额外的{% endplaceholder %}结束标记。如果占位符没有插件或插件不生成任何输出{% placeholder "..." or %},则呈现 和之间的所有内容。{% endplaceholder %}

例子:

{% placeholder "content" or %}

There is no content.

{% endplaceholder %}
于 2016-03-19T05:43:38.677 回答
4

这是一个非常紧凑的解决方案。

模板过滤器:

@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 %}
于 2015-11-17T21:34:53.343 回答
1

根据您要实现的目标,如果没有使用:empty选择器的内容,您可以简单地使用 CSS 隐藏元素。如果你担心空格,你可以使用 Django 的内置{% spaceless %}模板标签来删除它们。

所以你会得到这个模板:

{% spaceless %}
<div class="hide_if_empty">
    {% placeholder "my_placeholder" %}
</div>
{% endspaceless %}

这个CSS:

hide_if_empty:empty {
    display: none;
}

不完全是要求的内容,因为它不会删除 HTML - 但这将解决最常见的情况,即人们想要检查占位符是否为空,并且不需要引入新的模板标签。

于 2016-07-22T14:10:06.250 回答
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 包中

于 2020-01-30T14:26:23.423 回答