Який еквівалент "жоден" у шаблонах джанго?


102

Я хочу перевірити, чи немає поля / змінної в шаблоні Django. Який правильний синтаксис для цього?

Це те, що я зараз маю:

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

У наведеному вище прикладі, що б я використав, щоб замінити "null"?

Відповіді:


132

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%} і дізнався, що він недоступний. Зайнятий роботою навколо цього.
тобич

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
Будь-яка ідея, як використовувати це з іншими фільтрами, такими як дата? Наприклад, чи можна відобразити "Недоступно", якщо дата відсутня, але в іншому випадку її форматувати? Подобається: {{post.pub_date | default_if_none: "Недоступно" | дата: "Ymd"}}?
Андреас Бергстрем,

@ AndreasBergström У вашому випадку ви подаєте заявку dateпершим. Якщо виникає помилка, вона повертає None. Тоді ви подаєте заявку default_if_none.
дефанс

Яку версію Django було запроваджено?
Користувач


5

Подивіться на помічника Yesno

Наприклад:

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

4

{% if profile.user.first_name %}працює (припускаючи, що ви також не хочете приймати '').

ifв Python взагалі лікує None, False, '', [], {}, ... все як помилкове.


3

Ви також можете використовувати вбудований фільтр шаблонів 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

0

Ви можете спробувати це:

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

Таким чином, ви по суті перевіряєте, чи first_nameмає поле форми якесь значення, пов’язане з ним. Див. {{ field.value }}У циклі циклічного перегляду полів форми в документації Django .

Я використовую Django 3.0.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.