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


104

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

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

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

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

Ответы:


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


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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.