Django中当变量为None时默认模板标签输出的设置?

34 投票
3 回答
21157 浏览
提问于 2025-04-17 03:18

我想找一个django的设置或者编程方法,让所有的django模板标签在值为None的时候显示空字符串。举个例子,我有一个django模板:

{{cat}} chases {{mouse}}

如果cat和mouse都是None,它会渲染成:

None chases None

我知道我可以用{{cat|default:""}}或者{{mouse|default_if_none:""}}来设置每一个标签。

但是,我想要一个设置,可以让所有标签都默认这样,而不需要在每个标签后面都加上|default:""

我还知道有一个叫TEMPLATE_STRING_IF_INVALID的设置。不过,这个设置只适用于无效字符串,而None被认为是有效的。

3 个回答

4

这个方法应该能解决问题,把它放在初始化代码的某个地方,比如在 wsgi.py 文件里。

# Patch template Variable to output empty string for None values
from django.template.base import Variable
_resolve_lookup = Variable._resolve_lookup
def new_resolve_lookup(self, *args, **kwargs):
    o = _resolve_lookup(self, *args, **kwargs)
    return o or u""
Variable._resolve_lookup = new_resolve_lookup
4

“明确比隐含更好”

想象一下,如果因为你忘了开启那个“把所有假值渲染成空字符串”的设置,导致页面显示不正常,你会有多生气。

如果你发现自己经常在使用 default_if_none 这个过滤器,可能可以考虑在把数据传给模板之前,就把 None 转换成 ''(空字符串)。

这样一来,你的模板会更简单,而且你就明确地做出了将空值转换成字符串的决定。

42

其实并没有这样的东西。这就是为什么会有 defaultdefault_if_none 这两个过滤器的原因。这是一个 特性;它让你在编程时多思考,而不是依赖一些可能会让人误解的行为。如果一个变量有可能是 None(也就是没有值),那么你就应该为这种情况做好准备。如果这个变量应该总是有 某个 值,那么出现 "None" 就说明有什么不对劲。如果默认情况下只是显示一个空字符串,你就无法判断这个值是没有定义,还是确实是一个空字符串。所以,写出清晰的代码,不要想着走捷径。

撰写回答