Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django CMS - check if placeholder is empty

I use:

  • DjangoCMS 2.4
  • Django 1.5.1
  • Python 2.7.3

I would like to check if my placeholder is empty.

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

I don't want the html between the placeholder to be created if the placeholder is empty.

{% if placeholder "my_placeholder" %}
<div>
    {% placeholder "my_placeholder" or %}
    {% endplaceholder %}
</div>
{% endif %}
like image 238
21S Avatar asked Jun 17 '13 12:06

21S


4 Answers

Here's a very compact solution.

Template filter:

@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()

Usage in template:

{% if request|placeholder_is_empty:'myplaceholder' %}
    <h1>Here comes some content... </h1>
{% endif %}
like image 188
Philipp Zedler Avatar answered Nov 09 '22 23:11

Philipp Zedler


There is no built-in way to do this at the moment in django-cms, so you have to write a custom template tag. There are some old discussions about this on the django-cms Google Group:

  • https://groups.google.com/forum/#!topic/django-cms/WDUjIpSc23c/discussion
  • https://groups.google.com/forum/#!msg/django-cms/iAuZmft5JNw/yPl8NwOtQW4J
  • https://groups.google.com/forum/?fromgroups=#!topic/django-cms/QeTlmxQnn3E
  • https://groups.google.com/forum/#!topic/django-cms/2mWvEpTH0ns/discussion

Based on the code in the first discussion, I've put together the following Gist:

  • https://gist.github.com/timmyomahony/5796677

I use it like so:

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

{% if my_placeholder %}
<div>
    {{ my_placeholder }}
</div>
{% endif %}
like image 39
Timmy O'Mahony Avatar answered Nov 10 '22 00:11

Timmy O'Mahony


Depending on what you are trying to achieve, you can simply use CSS to hide the element if doesn't have content using the :empty selector. And if you are worried about white spaces you can use Django's in-build {% spaceless %} template tag to remove them.

So you'd get this template:

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

And this CSS:

hide_if_empty:empty {
    display: none;
}

Not exactly what was asked for as it doesn't remove the HTML - but this will solve the most common case where one wants to check if a place holder is empty, and doesn't require the introduction of a new template tag.

like image 40
Alice Heaton Avatar answered Nov 10 '22 01:11

Alice Heaton


If you want additional content to be displayed in case the placeholder is empty, use the or argument and an additional {% endplaceholder %} closing tag. Everything between {% placeholder "..." or %} and {% endplaceholder %} is rendered in the event that the placeholder has no plugins or the plugins do not generate any output.

Example:

{% placeholder "content" or %}

There is no content.

{% endplaceholder %}
like image 43
Ashish Gupta Avatar answered Nov 09 '22 23:11

Ashish Gupta