What is the equivalent of "none" in django templates?
Asked Answered
A

9

145

I want to see if a field/variable is none within a Django template. What is the correct syntax for that?

This is what I currently have:

{% if profile.user.first_name is null %}
  <p> -- </p>
{% elif %}
  {{ profile.user.first_name }} {{ profile.user.last_name }}
{% endif%}

In the example above, what would I use to replace "null"?

Arciniega answered 14/8, 2012 at 3:17 Comment(0)
C
176

None, False and True all are available within template tags and filters. None, False, the empty string ('', "", """""") and empty lists/tuples all evaluate to False when evaluated by if, so you can easily do

{% if profile.user.first_name == None %}
{% if not profile.user.first_name %}

A hint: @fabiocerqueira is right, leave logic to models, limit templates to be the only presentation layer and calculate stuff like that in you model. An example:

# someapp/models.py
class UserProfile(models.Model):
    user = models.OneToOneField('auth.User')
    # other fields

    def get_full_name(self):
        if not self.user.first_name:
            return
        return ' '.join([self.user.first_name, self.user.last_name])

# template
{{ user.get_profile.get_full_name }}
Corollaceous answered 14/8, 2012 at 4:40 Comment(4)
I just tried to pass None as a parameter to the {% cache %} tag and learned that it's not available. Busy working around this.Babirusa
{% if profile.user.first_name is None %} causes syntax error in Django template.Subtorrid
Your hint mixes presentation and logic by putting HTML in your model, doing exactly the opposite of what you are trying to teach. How about returning None if there is no name (logical behaviour for a data model) and then using the default_if_none filter in the template?Poppy
@JasperBryant-Greene you are right! just updated. Good catch man! Thx!Corollaceous
S
103

You can also use another built-in template default_if_none

{{ profile.user.first_name|default_if_none:"--" }}
Stirrup answered 5/3, 2015 at 14:46 Comment(3)
Any idea how to use this with other filters such as date? For example, is it possible to display "N/A" if a date is none but otherwise format it? Like: {{ post.pub_date|default_if_none:"N/A"|date:"Y-m-d" }}?Lei
@AndreasBergström In your case you apply date first. If any error occurs it will return None. Then you apply default_if_none.Adria
What version of Django was this brought in?Bronson
M
18

You can also use the built-in template filter default:

If value evaluates to False (e.g. None, an empty string, 0, False); the default "--" is displayed.

{{ profile.user.first_name|default:"--" }}

Documentation: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#default

Meador answered 23/10, 2014 at 21:10 Comment(2)
default_if_none would probably be a better option.Mauro
If the output is an empty string, this works while default_if_none does NOT. Choose carefully.Semiliterate
I
17

isoperator : New in Django 1.10

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
Iatrics answered 27/8, 2016 at 3:47 Comment(0)
S
6

Look at the yesno helper

Eg:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
Sturgill answered 27/11, 2013 at 10:52 Comment(0)
H
4

{% if profile.user.first_name %} works (assuming you also don't want to accept '').

if in Python in general treats None, False, '', [], {}, ... all as false.

Hunfredo answered 14/8, 2012 at 3:19 Comment(0)
T
3

In cases where we need to validate for a field with null value, we may check so and process as under:

{% for field in form.visible_fields %}
    {% if field.name == 'some_field' %}
        {% if field.value is Null %}
            {{ 'No data found' }}
        {% else %}
            {{ field }}
        {% endif %}
    {% endif %}
{% endfor %}
Thill answered 10/7, 2022 at 13:12 Comment(0)
C
1

You could try this:

{% if not profile.user.first_name.value %}
  <p> -- </p>
{% else %}
  {{ profile.user.first_name }} {{ profile.user.last_name }}
{% endif %}

This way, you're essentially checking to see if the form field first_name has any value associated with it. See {{ field.value }} in Looping over the form's fields in Django Documentation.

I'm using Django 3.0.

Commentate answered 30/7, 2020 at 21:17 Comment(0)
O
1

Just a note about previous answers: Everything is correct if we want to display a string, but pay attention if you want to display numbers.

In particular when you have a 0 value bool(0) evaluates to False and so it will not display and probably is not what you want.

In this case better use

{% if profile.user.credit != None %}
Outdate answered 28/7, 2021 at 7:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.