Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django CMS-检查占位符是否为空_Python_Html_Django_Django Cms - Fatal编程技术网

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

Python Django CMS-检查占位符是否为空,python,html,django,django-cms,Python,Html,Django,Django Cms,我使用: DjangoCMS 2.4 Django 1.5.1 Python 2.7.3 我想检查我的占位符是否为空 <div> {% placeholder "my_placeholder" or %} {% endplaceholder %} </div> {% if placeholder "my_placeholder" %} <div> {% placeholder "my_placeholder" or %}

我使用:

  • DjangoCMS 2.4
  • Django 1.5.1
  • Python 2.7.3
我想检查我的占位符是否为空

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

{%占位符“我的占位符”或%}
{%endplaceholder%}
如果占位符为空,我不希望在占位符之间创建html

<div>
    {% placeholder "my_placeholder" or %}
    {% endplaceholder %}
</div>
{% if placeholder "my_placeholder" %}
<div>
    {% placeholder "my_placeholder" or %}
    {% endplaceholder %}
</div>
{% endif %}
{%if占位符“my_占位符”%}
{%占位符“我的占位符”或%}
{%endplaceholder%}
{%endif%}

目前django cms中没有内置的方法来实现这一点,因此您必须编写自定义模板标记。在
django cms
Google小组中有一些关于这一点的老讨论:

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

我这样使用它:

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

{% if my_placeholder %}
<div>
    {{ my_placeholder }}
</div>
{% endif %}
{%load extra\u cms\u tags%}
{%get_placeholder“My placeholder”作为My_placeholder%}
{%if我的_占位符%}
{{my_占位符}}
{%endif%}

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

模板筛选器:

@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 %}
{% spaceless %}
<div class="hide_if_empty">
    {% placeholder "my_placeholder" %}
</div>
{% endspaceless %}
{%如果请求|占位符_为空:'myplaceholder'%}
这里有一些内容。。。
{%endif%}

如果要在占位符为空的情况下显示其他内容,请使用
参数和其他
{%endplaceholder%}
结束标记。如果占位符没有插件或插件没有生成任何输出,则呈现
{%endplaceholder“…”或%}
{%endplaceholder%}
之间的所有内容

例如:

{% placeholder "content" or %}

There is no content.

{% endplaceholder %}

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

因此,您将获得以下模板:

{% if request|placeholder_is_empty:'myplaceholder' %}
    <h1>Here comes some content... </h1>
{% endif %}
{% spaceless %}
<div class="hide_if_empty">
    {% placeholder "my_placeholder" %}
</div>
{% endspaceless %}

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

基于伟大的答案表单@Philip Zedler,这是一种适用于django cms页面上两个占位符的解决方案,但也在“cms之外”的占位符上

模板中的用法

{% if request.current_page|placeholder_empty:'content' %}
    <h1>Fallback!</h1>
{% endif %}

{%if请求。当前页面|占位符_为空:'content'%}
退路!
{%endif%}

这是我的

我是初学者。文件应该放在哪里?它是一个模板标签,因此您必须在一个应用程序中创建一个名为
templatetags
的文件夹,创建一个文件(
extra\u cms\u tags.py
),然后在模板中调用
{%load extra\u cms\u tags%}
导入它。您刚刚成为我的一天。别忘了将
\uuuu init\uuuuuuuuy.py
添加到您的
templatetags
文件夹中。有关更多详细信息,请参阅。如果您继续滚动,则会有一个更好的答案:这应该是正确的答案。超级简单,不需要模板标记。这很好,但它不允许您仅在占位符不为空时输出HTML内容。@Flimm我不确定您在哪个版本中尝试过,但它没有这样做,但是在
django cms==3.4.6
上,它就像一个符咒:只有当占位符为空时,标签之间的内容才会出现。为什么不返回占位符.cmsplugin_set.exists()?2019年还需要这个,还是现在有更好的工具?它仍然有效,但想知道是否有一种“内置”方式?是的,@jabez,exists()更好。我已经编辑了我的答案。为了自己实现这个功能,我应该把模板过滤器文件放在哪里?@jmona789,这里有很好的解释: