Определить пустую переменную шаблона в Django

Я не могу определить, является ли переменная пустой при использовании в шаблоне. Я перебрал всю коллекцию и в каждой ищу переменную narrative_text.

Я проверил пустую переменную с помощью

{% ifnotequal narratives.narrative_text '' %}

Я заметил, что элемент управления входит в этот блок, но ничего не печатает/пусто, когда

{{  narratives.narrative_text }} 

встречается.

Итак, как мне точно проверить, пуста ли переменная?

Я прочитал документацию и обнаружил, что недопустимые/пустые переменные шаблона заменяются на ''.

Док говорит, что

система шаблонов вставляет значение параметра TEMPLATE_STRING_IF_INVALID.

Должны ли мы явно вводить это в settings.py? Я пытался сделать это, но все же я не смог заставить его работать.

c=Context({ 
    "narratives_list":all_narratives,
    "patient_name":care_seeker_name
})

all_narratives возвращается вызовом базы данных pymongo.

{%  for narratives in narratives_list  %}
<tr>
<td class = "date_col">
    7 Aug, 2012
</td>
{%  ifnotequal narratives.narrative_text '' %}
<td>
<div class = "narrative">
    ( text narrative )
<b> 
    {{ narratives.about }}
</b>
<br><br>
{{ narratives.narrative_text }}
</div>  
</td>   
{%  else %}
<td>
<div class="scans">
<div class="gallery">
<b> {{ narratives.about }}</b>
<br><br>
<a href="https://udhc1-nodejstest.rhcloud.com/my_image/{{ narratives.file_id }}">
<img src="https://udhc1-nodejstest.rhcloud.com/my_image/{{ narratives.file_id }}" width="72" height="72" alt="" />
</a>
</div>
</div>
</td>
{%  endifnotequal %}

person sbose    schedule 20.09.2012    source источник
comment
Django также ничего не отобразит, если произойдет ошибка, например. если имя не существует.   -  person Hans Then    schedule 20.09.2012
comment
Спасибо @HansТогда он должен вернуть «ложь» при сравнении с использованием ifnotequals с «»?   -  person sbose    schedule 20.09.2012
comment
Я думал, что он пропустит весь блок. В основном ошибка означает забыть это утверждение. Также внутри if.   -  person Hans Then    schedule 20.09.2012
comment
Каким должен быть обходной путь?   -  person sbose    schedule 20.09.2012
comment
Для отладки убедитесь, что narratives_list не пусто. Если это не так, проверьте, печатается ли блок else. Если это не так, вы знаете, что у вас есть ошибка. В противном случае вы можете проверить код (не шаблон), чтобы увидеть, что находится в этих переменных, используя оператор logging.debug().   -  person Hans Then    schedule 20.09.2012


Ответы (6)


Труба через длину и сделать свой тест против этого значения.

{% if narratives.narrative_text|length > 0 %}
    {{ narratives.narrative_text }}
{% else %}
    None
{% endif %}
person Wade Williams    schedule 25.06.2013
comment
это такое уродливое, но хорошее решение, Уэйд. Я начинаю понимать, почему люди называют jinja2 выше шаблонов django. - person codyc4321; 24.04.2016

Просто используйте {% if narratives.narrative_text %}, я думаю. Он будет использовать неявное значение false Python, которое применяется к пустым строкам, пустым массивам, пустым словарям, None, False, 0 и т. д.

person Torsten Engelbrecht    schedule 20.09.2012
comment
Спасибо @Torsen, я попробовал это. Блок if th.en пропускался, даже если narratives.narrative_text не был пустым. - person sbose; 20.09.2012

Только что подтвердил с помощью моего собственного кода с использованием django 2.1.3 и python 3.5 и 3.7, что работает следующее:

{% if narratives.narrative_text %}
    # do something
    {{ narratives.narrative_text }}
{% else %}
    # do something else
    None  # displays "None" 
{% endif %}
person Dmitriy    schedule 06.11.2018

Вы можете написать пользовательский фильтр шаблонов, is_empty для проверки. Возвращает false, если переменная пуста, и true, если значение существует.

{% if narratives.narrative_text|is_empty %}
    # dosomthing 
{% else %}
    # dosomthing 
{% endif %}
person Ahsan    schedule 20.09.2012

Я думаю, что лучшим и очевидным решением было бы на языке шаблонов Django:

{% if objects is not None %}
    {% for obj in objects %}
        {{obj}}   // Do your stuff here
    {% empty %}
        No results.    // No results case
    {% endfor %}
{% endif %}

Если переменная objects не задана, ничего не будет напечатано.

У меня были аналогичные трудности. Надеюсь, поможет.

person decadenza    schedule 30.01.2019
comment
Это самый лаконичный способ обработки пустого списка, если вам нужно распечатать сообщение в шаблоне, отметив его. - person Harlin; 04.12.2019

Я использовал jijnja, который очень похож и проще, и я думаю, что он будет работать, если вы сделаете

{% if not narratives.narrative_text %}
  // do something 
{% else %}
 // do something else  with or without {{ narratives.narrative_text }}
{% endif %}

Он использует python неявный True/False,None, и т. д. для выполнения этой работы. Проще говоря, используйте переменные python внутри {{ }} и условные выражения и т. д. внутри {% %}

person emiljho    schedule 20.09.2012