的对象UndefinedErrors我从Django中切换到神社,但引用的Jinja2忽略未发现
{{ entity.property }}
时,如果没有定义的实体有很多我的模板坏了。有没有去忽略在某些情况下UndefinedErrors,否则我将不得不在很多
{% if entity %}{{ entity.property }}{% endif %}
包装增加。
感谢, 理查德
的对象UndefinedErrors我从Django中切换到神社,但引用的Jinja2忽略未发现
{{ entity.property }}
时,如果没有定义的实体有很多我的模板坏了。有没有去忽略在某些情况下UndefinedErrors,否则我将不得不在很多
{% if entity %}{{ entity.property }}{% endif %}
包装增加。
感谢, 理查德
Jinja2的实际使用未定义的实体的特殊类。你可以从Jinja2中继承这个Undefined
类的子类,以包含__getattr__
和其他attribute accessors,你甚至可以在未定义的实体上使用它们并让它们返回一个空白的unicode字符串(例如)。
建立关肖恩的优秀,乐于助人的答案,我做了以下内容:
from jinja2 import Undefined
import logging
class SilentUndefined(Undefined):
'''
Dont break pageloads because vars arent there!
'''
def _fail_with_undefined_error(self, *args, **kwargs):
logging.exception('JINJA2: something was undefined!')
return None
,然后env = Environment(undefined=SilentUndefined)
在那里我打电话说。
在django_jinja库,这是我用,上面是base.py
,实际上是initial_params
修改我建@拉特雷的回答以上:
from jinja2 import Undefined, Template
class SilentUndefined(Undefined):
def _fail_with_undefined_error(self, *args, **kwargs):
return ''
然后用模板字符串用它:
person_dict = {'first_name': 'Frank', 'last_name': 'Hervert'}
t2 = Template("{{ person1.last_name }}, {{ person.last_name }}", undefined=SilentUndefined)
print t2.render({'person': person_dict})
# ', Hervert'
我需要忽略错误的渲染从字符串模板时,而不是直接使用环境。
我还需要重置类的魔术方法,使对象属性等工作正常。添加到@rattray -
from jinja2 import Undefined, Template
class SilentUndefined(Undefined):
def _fail_with_undefined_error(self, *args, **kwargs):
return ''
__add__ = __radd__ = __mul__ = __rmul__ = __div__ = __rdiv__ = \
__truediv__ = __rtruediv__ = __floordiv__ = __rfloordiv__ = \
__mod__ = __rmod__ = __pos__ = __neg__ = __call__ = \
__getitem__ = __lt__ = __le__ = __gt__ = __ge__ = __int__ = \
__float__ = __complex__ = __pow__ = __rpow__ = \
_fail_with_undefined_error
这是有道理的,成为一个忍者设置。很多人会来自django默认默认模板。
这是SilentUndefined的唯一变体,适用于我 – Anton 2017-06-13 21:45:34
也正在寻找解决方案,并使用@ s29 SilentUndefined类,但我发现“'str'对象不可调用”错误时,未定义的变量被试图调用,所以这是我的解决方法,它可能是有人乐于助人
class SilentUndefined(Undefined):
def _fail_with_undefined_error(self, *args, **kwargs):
class EmptyString(str):
def __call__(self, *args, **kwargs):
return ''
return EmptyString()
__add__ = __radd__ = __mul__ = __rmul__ = __div__ = __rdiv__ = \
__truediv__ = __rtruediv__ = __floordiv__ = __rfloordiv__ = \
__mod__ = __rmod__ = __pos__ = __neg__ = __call__ = \
__getitem__ = __lt__ = __le__ = __gt__ = __ge__ = __int__ = \
__float__ = __complex__ = __pow__ = __rpow__ = \
_fail_with_undefined_error
感谢信息 – 2011-05-31 18:02:42
相关的非常有用位:http://stackoverflow.com/questions/6182498/jinja2-how-to-make-it-fail-silently-like-djangotemplate/6192308 – 2015-12-20 15:49:23