2011-05-31 112 views
8

的对象UndefinedErrors我从Django中切换到神社,但引用的Jinja2忽略未发现

{{ entity.property }} 

时,如果没有定义的实体有很多我的模板坏了。有没有去忽略在某些情况下UndefinedErrors,否则我将不得不在很多

{% if entity %}{{ entity.property }}{% endif %} 

包装增加。

感谢, 理查德

回答

5

Jinja2的实际使用未定义的实体的特殊类。你可以从Jinja2中继承这个Undefined类的子类,以包含__getattr__和其他attribute accessors,你甚至可以在未定义的实体上使用它们并让它们返回一个空白的unicode字符串(例如)。

+1

感谢信息 – 2011-05-31 18:02:42

+0

相关的非常有用位:http://stackoverflow.com/questions/6182498/jinja2-how-to-make-it-fail-silently-like-djangotemplate/6192308 – 2015-12-20 15:49:23

5

建立关肖恩的优秀,乐于助人的答案,我做了以下内容:

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

2

修改我建@拉特雷的回答以上:

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' 

我需要忽略错误的渲染从字符串模板时,而不是直接使用环境。

3

我还需要重置类的魔术方法,使对象属性等工作正常。添加到@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默认默认模板。

+0

这是SilentUndefined的唯一变体,适用于我 – Anton 2017-06-13 21:45:34

1

也正在寻找解决方案,并使用@ 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