【问题标题】:Determine empty template variable in Django确定Django中的空模板变量
【发布时间】:2012-09-12 12:05:41
【问题描述】:

我无法确定在模板中使用的变量是否为空。 我已经遍历了整个集合,并且在每个集合中我都在寻找一个变量 narrative_text

我通过

测试了空变量
{% ifnotequal narratives.narrative_text '' %}

我注意到控件进入了这个块,但是当

{{  narratives.narrative_text }} 

遇到了。

那么,如何精确检查变量是否为空?

我阅读了the docs 并发现无效/空模板变量被'' 替换。

医生这么说

模板系统插入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 %}

【问题讨论】:

  • 如果发生错误,Django 也不会显示任何内容,例如如果名称不存在。
  • 谢谢@HansThen,那么当使用 ifnotequals 和 '' 进行比较时,它应该返回一个 'false' ?
  • 我认为它会跳过整个区块。基本上错误意味着忘记这个声明。也在 if 中。
  • 解决方法应该是什么?
  • 要调试,请检查narratives_list 是否为空。如果不是,请检查是否打印了 else 块。如果不是,你知道你有一个错误。否则,您可以使用 logging.debug() 语句签入代码(而不是模板)以查看这些变量中的内容。

标签: python django mongodb django-templates pymongo


【解决方案1】:

管道通过长度并针对该值进行测试。

{% if narratives.narrative_text|length > 0 %}
    {{ narratives.narrative_text }}
{% else %}
    None
{% endif %}

【讨论】:

  • 这太丑了,但是很好的解决方案韦德。我开始明白为什么人们称 jinja2 优于 django 模板
【解决方案2】:

我想就用{% if narratives.narrative_text %}吧。它将使用 Python 的隐式 false,适用于空字符串、空数组、空字典、NoneFalse0 等。

【讨论】:

  • 谢谢@Torsen 我试过了。即使narratives.narrative_text 不为空,也会跳过“if th.en”块
【解决方案3】:

刚刚通过我自己的代码使用 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 %}

【讨论】:

    【解决方案4】:

    你可以写Custom template filter,is_empty来检查。如果变量为空则返回false,如果值存在则返回true

    {% if narratives.narrative_text|is_empty %}
        # dosomthing 
    {% else %}
        # dosomthing 
    {% endif %}
    

    【讨论】:

      【解决方案5】:

      我认为最好和最明显的解决方案是使用 Django 模板语言:

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

      如果没有设置变量objects,则不会打印任何内容。

      我也有类似的困难。 希望对您有所帮助。

      【讨论】:

      • 如果您需要在模板中打印一条消息并注明它,这是处理空列表的最简洁方法。
      【解决方案6】:

      我使用了jijnja,它非常相似且更简单,我认为如果你这样做的话它会起作用

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

      它使用 python 隐式True/False,None, 等来完成这项工作。 简单来说,在{{ }} 中使用python 变量,在{% %} 中使用条件等

      【讨论】:

        猜你喜欢
        • 2012-08-14
        • 2014-06-17
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 2021-06-14
        • 1970-01-01
        • 2018-05-07
        相关资源
        最近更新 更多