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-7.django模板继承(block和extends)