Python Django 模板中如何判断变量是否为null或空字符串

37 投票
6 回答
47409 浏览
提问于 2025-04-16 21:10

我刚接触Django,但在Java编程方面有很多年的经验,所以问这个问题我觉得有点不好意思——我相信答案应该很明显,但我就是没找到。我在谷歌上搜索了好久,也查了Django的文档,但要么没有相关内容,要么我就是没看到。我想在模板中测试一个变量,看它是否既不是空值,也不是空字符串,或者只是一些空格。我遇到的问题是,字段中出现了空格——这是我还需要解决的另一个问题……不过,我希望我的逻辑能正常工作。现在,因为我的字符串只包含空格,简单地使用这个:{% if lesson.assignment %} 总是返回真,尽管我并不想要这个结果。我找过类似于去掉空格的功能,但在{% %}之间似乎找不到任何东西。我试过strip,但在{% %}之间不起作用。有人能指点我一下答案的方向吗……或者我可能错过的文档……什么都行!

非常感谢!

6 个回答

5

如果 lesson.assignment 是一个模型字段,你可以在你的模型里定义一个辅助函数,然后使用它:

class Lesson(models.Model):
    assignment = models.CharField(..., null=True, ...)
    # ...

    @property
    def has_assignment(self):
        return self.assignment is not None and self.assignment.strip() != ""

接着在你的模板中使用 {% if lesson.has_assignment %}

6

这个在提问的时候可能还没有被提到,但有一个选择是可以使用内置的模板过滤器 default_if_noneDjango 文档链接)。

举个例子: {{ lesson.assignment|default_if_none:"Empty" }}

64
{% if lesson.assignment and lesson.assignment.strip %}

.strip 是调用 str.strip() 方法,这样你就可以把只有空格的字符串当作空字符串来处理。同时,前面的检查确保我们先排除掉 None(因为 None 是没有 .strip() 方法的)。

这里有个证明它有效的例子(在 ./manage.py shell 中):

>>> import django
>>> from django.template import Template, Context
>>> t = Template("{% if x and x.strip %}OK{% else %}Empty{% endif %}")
>>> t.render(Context({"x": "ola"}))
u'OK'
>>> t.render(Context({"x": "   "}))
u'Empty'
>>> t.render(Context({"x": ""}))
u'Empty'
>>> t.render(Context({"x": None}))
u'Empty'

撰写回答