django模板中的“ none”是什么意思?


101

我想看看Django模板中是否没有字段/变量。正确的语法是什么?

这是我目前拥有的:

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

在上面的示例中,我将用什么来替换“空”?

Answers:


131

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 2013年

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'18年

@AndreasBergström您的情况要date首先申请。如果发生任何错误,它将返回无。然后您申请default_if_none
防守

引入了哪个版本的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一般对待NoneFalse''[]{},...所有为假。



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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.