"Django模板中的“none”相当于什么?"

144
我想在Django模板中查看一个字段/变量是否为None。这样做的正确语法是什么?
这是我目前拥有的:
{% if profile.user.first_name is null %}
  <p> -- </p>
{% elif %}
  {{ profile.user.first_name }} {{ profile.user.last_name }}
{% endif%}
在上面的例子中,我应该使用什么来替换 "null"?
9个回答

176

None, False 和 True 都可以在模板标签和过滤器中使用。当被 if 语句评估时,None, False,空字符串 ('', "", """""") 和空列表/元组都会被评估为 False,因此您可以轻松地执行如下操作:

{% 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
在Django模板中,如果profile.user.first_name为空,则会导致语法错误。 - Rockallite
1
你的提示混合了演示和逻辑,通过将HTML放入模型中,完全做了你试图教授的相反的事情。如果没有名称,则返回None(数据模型的逻辑行为),然后在模板中使用default_if_none过滤器如何? - jbg
@JasperBryant-Greene 你说得对!刚刚更新了。干得好,伙计!谢谢! - Gerard

101

您还可以使用另一个内置模板default_if_none

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

1
有没有想过如何将它与其他筛选器一起使用,比如日期?例如,如果日期为空,是否可以显示“N/A”,否则格式化它?像这样: {{ post.pub_date | default_if_none:"N/A" | date:"Y-m-d" }}? - Andreas Bergström
@AndreasBergström 在你的情况下,你首先应用 date。如果出现任何错误,它将返回 None。然后你应用 default_if_none - defance
这是哪个版本的Django引入的? - User

17

1
default_if_none可能是更好的选项。 - dbn
如果输出为空字符串,则此方法有效,而default_if_none方法则无效。请谨慎选择。 - gregory

16

is 运算符:Django 1.10 中新增的功能。

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}

6

请看yesno辅助工具。

例如:

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

4

{% if profile.user.first_name %} 是有效的(假设您也不想接受 '')。

在Python中,if 通常将 NoneFalse''[]{} 等所有内容视为 false。


3

在需要验证具有null值的字段的情况下,我们可以进行以下检查和处理:

{% for field in form.visible_fields %}
    {% if field.name == 'some_field' %}
        {% if field.value is Null %}
            {{ 'No data found' }}
        {% else %}
            {{ field }}
        {% endif %}
    {% endif %}
{% endfor %}

1

关于之前的答案,需要说明的是:如果我们想要显示字符串,那么所有的答案都是正确的,但是如果您想要显示数字,请注意。

特别是当您有一个值为0的情况时,bool(0)会被计算为False,因此它将不会被显示,这可能不是您想要的结果。

在这种情况下,最好使用

{% if profile.user.credit != None %}

1
您可以尝试这个:
{% if not profile.user.first_name.value %}
  <p> -- </p>
{% else %}
  {{ profile.user.first_name }} {{ profile.user.last_name }}
{% endif %}

这样,您基本上是在检查表单字段first_name是否有任何关联值。请参见Django文档中循环遍历表单字段中的{{ field.value }}
我正在使用Django 3.0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接