我正在寻找一种django设置或编程方式,以使所有django模板标签在值为None时显示空字符串。例如,假设我有一些django模板:
{{cat}} chases {{mouse}}
如果cat和mouse都是None,它将呈现为:
None chases None
我知道我可以使用{{cat|default:""}}
或{{mouse|default_if_none:""}}
但是,我正在寻找某种设置,允许我为所有代码设置默认设置,而无需向每个代码明确添加|default:""
。
我也知道名为TEMPLATE_STRING_IF_INVALID
的设置。但是,此设置仅适用于无效字符串。没有被认为是有效的。
答案 0 :(得分:38)
不存在这样的事情。这就是default
和default_if_none
过滤器存在的原因。这是功能;它会让你思考你正在做的事情而不是依赖一些往往会产生误导的行为。如果变量有可能为None
,那么您应该计划该意外事件。如果变量应始终具有某些值,则“无”表示某些内容不正确。如果默认只是渲染一个空字符串,那么您将不知道该值是否未定义或实际上是空字符串。编写连贯的代码,忘记快捷方式。
答案 1 :(得分:4)
“明确比隐含更好”
想想当事情无法正常呈现时你会感到愤怒,因为你忘了你已经启用了魔法“使用虚假值作为空字符串渲染所有内容”设置。
如果您发现自己大量使用default_if_none
过滤器,则可能需要考虑在将其转移到模板之前将其转换为None
到''
。
您的模板会更简单,您将明确做出此决定以将字符串化为空值。
答案 2 :(得分:3)
这应该可以解决问题,将其放在初始化代码中的某个位置,例如。在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