Python Django 模板和测试变量是不是为空或空字符串

Posted

技术标签:

【中文标题】Python Django 模板和测试变量是不是为空或空字符串【英文标题】:Python Django Templates and testing if a variable is null or empty stringPython Django 模板和测试变量是否为空或空字符串 【发布时间】:2011-10-02 00:06:05 【问题描述】:

我对 django 很陌生,但是在 java 世界中有多年的编码经验,所以我觉得问这个问题很荒谬——我相信答案是显而易见的,我只是想念它。我似乎找不到在谷歌或其他东西中查询这个的正确方法......我已经搜索了 django 文档,它要么不存在,要么我只是没有看到它。我要做的就是在模板测试中,如果 var 不为 null 或空字符串或只是一堆空格。我有一个空间被引入我的领域的问题 - 我必须并且将解决的另一个问题......但是,我希望我的逻辑无论如何都能工作。现在,因为我的字符串只包含空格,所以只需这样做: % if course.assignment % 总是通过,即使我不希望它通过。我一直在寻找可以在 % % 之间工作的修剪类型功能,但我似乎找不到任何东西。我试过strip,但它在% %之间不起作用。有人可以指出我的答案方向吗...我可能错过了一些文档...什么?

提前非常感谢!

【问题讨论】:

【参考方案1】:

您可以通过使用cut filter 删除所有空格来模拟它。但是您可能应该首先找出为什么它包含所有空格。

【讨论】:

是的,我打算修正它包含所有空格的事实。但是,我希望它能够以任何一种方式工作,并且无法让 strip 函数工作(Shawn 上面的代码有效)。【参考方案2】:

您可以在 Django 模板变量的任何位置调用任何内置方法。例如,您可以调用 Python 字符串方法strip。所以这会起作用:

% if lesson.assignment.strip %

【讨论】:

问题:他的CharField 允许NULL,所以一个NULL 字段会导致异常,因为None 没有strip 方法。 我不知道为什么,但是我第一次尝试这样做失败了...我可能遇到了异常情况(null)...我不记得了。 试试% if lesson.assignment and lesson.assignment.strip %【参考方案3】:

如果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 %

【讨论】:

这是一个有趣的选项...我非常喜欢它如何清理模板中的逻辑。我对 python 和 django 很陌生,所以我还在学习。感谢您的建议!【参考方案4】:
% if lesson.assignment and lesson.assignment.strip %

.strip 调用 str.strip(),因此您可以将仅包含空格的字符串处理为空,而前面的检查确保我们首先清除了 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'

【讨论】:

@PaulP1975:您可能错过了它,因为在if 中使用and 是最近添加到Django 的。【参考方案5】:

发布问题时这可能不可用,但一种选择可能是使用内置模板过滤器default_if_none (Django Documentation Link)。

例如: lesson.assignment|default_if_none:"Empty"

【讨论】:

【参考方案6】:

这是一个简单的方法,从 Django 版本 3.2 开始

 lesson.assignment|default:"nothing" 

这适用于两种情况(空字符串和无对象)。

参考链接:https://docs.djangoproject.com/en/3.2/ref/templates/builtins/#std:templatefilter-default

【讨论】:

以上是关于Python Django 模板和测试变量是不是为空或空字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python之路--Django--模板

python测试开发django-7.django模板继承(block和extends)

python测试开发django-71.自定义标签tag

Django框架之templates(模板)系统

Django模板Javascript将python变量传递给javascript

在 Django 模板中使用外键作为变量