【问题标题】:Django CMS - check if placeholder is emptyDjango CMS - 检查占位符是否为空
【发布时间】:2013-06-13 10:03:00
【问题描述】:

我用:

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

【问题讨论】:

    标签: python html django django-cms


    【解决方案1】:

    基于出色的答案表单@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

    【讨论】:

      【解决方案2】:

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

      模板过滤器:

      @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 %}
      

      【讨论】:

      • 为什么不返回 placeholder.cmsplugin_set.exists()?
      • 2019 年还需要这个,还是现在有更好的工具?它仍然有效,但想知道是否有“内置”方式?
      • 是的,@jabez,exists() 更好。我已经编辑了我的答案。
      • 自己尝试实现这个功能,模板过滤文件应该放在哪里?
      • @jmona789,这里解释得很好:docs.djangoproject.com/en/2.2/howto/custom-template-tags
      【解决方案3】:

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

      例子:

      {% placeholder "content" or %}
      
      There is no content.
      
      {% endplaceholder %}
      

      【讨论】:

      • 这应该是正确的答案。超级简单,不需要模板标签。
      • 这很好,但它不会让您仅在占位符不为空的情况下输出 HTML 内容。
      • @Flimm 我不确定您尝试了哪个版本,但它没有这样做,但在django-cms==3.4.6 上,它就像一个魅力:标签之间的内容仅在占位符时出现是空的。
      【解决方案4】:

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

      所以你会得到这个模板:

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

      还有这个 CSS:

      hide_if_empty:empty {
          display: none;
      }
      

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

      【讨论】:

        【解决方案5】:

        目前在 django-cms 中没有内置的方法可以做到这一点,所以你必须编写一个自定义模板标签。在django-cms Google Group 上有一些关于此的旧讨论:

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

        我是这样使用的:

        {% load extra_cms_tags %}
        {% get_placeholder "My Placeholder" as my_placeholder %}
        
        {% if my_placeholder %}
        <div>
            {{ my_placeholder }}
        </div>
        {% endif %}
        

        【讨论】:

        • 我是初学者。文件应该放在哪里?
        • 这是一个模板标签,因此您必须在其中一个应用程序中创建一个名为 templatetags 的文件夹,创建一个文件(例如 extra_cms_tags.py)然后在您的模板中调用 {% load extra_cms_tags %} 来导入它
        • 谢谢。你让我很开心。
        • 别忘了将__init__.py 添加到您的templatetags 文件夹中;)。有关详细信息,请参阅custom template-tags documentation
        • 如果您继续滚动,会有更好的答案:stackoverflow.com/a/36098323/1605873
        猜你喜欢
        • 2017-12-24
        • 2013-10-08
        • 2012-11-02
        • 2013-08-25
        • 2019-08-17
        • 2015-05-20
        • 2019-02-27
        • 2013-03-22
        • 2015-03-16
        相关资源
        最近更新 更多