122

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

这是我目前拥有的:

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

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

4

8 回答 8

155

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 }}

希望这可以帮助 :)

于 2012-08-14T04:40:52.740 回答
85

您还可以使用其他内置模板default_if_none

{{ profile.user.first_name|default_if_none:"--" }}
于 2015-03-05T14:46:27.133 回答
13

您还可以使用内置的模板过滤器default

如果 value 评估为 False(例如 None、空字符串、0、False);显示默认的“--”。

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

文档: https ://docs.djangoproject.com/en/dev/ref/templates/builtins/#default

于 2014-10-23T21:10:25.347 回答
12

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

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
于 2016-08-27T03:47:20.293 回答
5

看看yesno助手

例如:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
于 2013-11-27T10:52:38.350 回答
3

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

if在 Python 中,一般将None, False, '', [], {}, ... 都视为错误。

于 2012-08-14T03:19:32.557 回答
1

只是关于以前答案的注释:如果我们想显示一个字符串,一切都是正确的,但如果你想显示数字,请注意。

特别是当您有一个 0 值bool(0)评估为False,因此它不会显示并且可能不是您想要的。

在这种情况下更好地使用

{% if profile.user.credit != None %}
于 2021-07-28T07:59:56.167 回答
0

你可以试试这个:

{% 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。

于 2020-07-30T21:17:34.377 回答