What is the equivalent of "none" in django templates?

PythonDjangoDjango FormsDjango TemplatesDjango Views

Python Problem Overview


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"?

Python Solutions


Solution 1 - Python

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

Hope this helps :)

Solution 2 - Python

You can also use another built-in template default_if_none

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

Solution 3 - Python

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

Solution 4 - Python

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

Solution 5 - Python

Look at the yesno helper

Eg:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}

Solution 6 - Python

{% 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.

Solution 7 - Python

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

Solution 8 - Python

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongoelvView Question on Stackoverflow
Solution 1 - PythonGerardView Answer on Stackoverflow
Solution 2 - PythonBabacar GningueView Answer on Stackoverflow
Solution 3 - PythonLouisView Answer on Stackoverflow
Solution 4 - Pythonuser6763622View Answer on Stackoverflow
Solution 5 - PythonmwjacksonView Answer on Stackoverflow
Solution 6 - PythonDanicaView Answer on Stackoverflow
Solution 7 - PythonpiertoniView Answer on Stackoverflow
Solution 8 - PythonclaypoojView Answer on Stackoverflow