Что эквивалентно «none» в шаблонах django?

104

Я хочу увидеть, нет ли поля / переменной в шаблоне Django. Какой для этого правильный синтаксис?

Вот что у меня сейчас есть:

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

Что бы я использовал в приведенном выше примере для замены «null»?

Goelv
источник

Ответы:

134

None, False and Trueвсе они доступны в тегах и фильтрах шаблона. None, False, пустая строка ( '', "", """""") и пустые списки / кортежи все оцениваются Falseпри оценке if, поэтому вы можете легко сделать

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

Подсказка: @fabiocerqueira права, оставьте логику моделям, ограничьте шаблоны, чтобы они были единственным слоем представления, и рассчитывайте подобные вещи в своей модели. Пример:

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

Надеюсь это поможет :)

Джерард
источник
Я просто попытался передать None в качестве параметра тегу {% cache%} и узнал, что он недоступен. Занят, работая над этим.
tobych
7
{% if profile.user.first_name is None %}вызывает синтаксическую ошибку в шаблоне Django.
Rockallite
1
Ваша подсказка смешивает представление и логику, помещая HTML в вашу модель, делая прямо противоположное тому, чему вы пытаетесь научить. Как насчет того, чтобы вернуть None, если имя отсутствует (логическое поведение модели данных), а затем использовать default_if_noneфильтр в шаблоне?
jbg
@ JasperBryant-Greene, вы правы! только что обновился. Хороший улов! Спасибо!
Gerard
67

Вы также можете использовать другой встроенный шаблон default_if_none

{{ profile.user.first_name|default_if_none:"--" }}
Бабакар Джингуэ
источник
1
Есть идеи, как использовать это с другими фильтрами, такими как дата? Например, можно ли отобразить «N / A», если дата не указана, но в противном случае отформатировать ее? Например: {{post.pub_date | default_if_none: "N / A" | date: "Ymd"}}?
Андреас Бергстрём
@ AndreasBergström В вашем случае вы dateсначала подаете заявку . Если произойдет какая-либо ошибка, он вернет None. Потом подаешь заявку default_if_none.
defance
Какая версия Django была добавлена?
Пользователь
10

isоператор: Новое в Django 1.10

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
user6763622
источник
5

Посмотри на помощника дано

Например:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
Mwjackson
источник
4

{% if profile.user.first_name %}работает (при условии, что вы также не хотите принимать '').

ifв Python вообще лечит None, False, '', [], {}, ... все как ложное.

ди-джеи
источник
4

Вы также можете использовать встроенный шаблонный фильтр default :

Если значение равно False (например, None, пустая строка, 0, False); по умолчанию отображается «-».

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

Документация: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#default

Луи
источник
1
default_if_none, вероятно, будет лучшим вариантом.
dbn 09
0

Вы можете попробовать это:

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

Таким образом, вы, по сути, проверяете, first_nameимеет ли поле формы какое-либо значение, связанное с ним. См {{ field.value }}в Looping над полей формы в Django в документации .

Я использую Django 3.0.

Claypooj
источник