Jinja2忽略未找到的对象的UndefinedErrors

pro*_*ach 12 python jinja2

我从Django切换到Jinja但是在引用时我的很多模板都坏了

 {{ entity.property }}
Run Code Online (Sandbox Code Playgroud)

如果实体未定义.在某些情况下是否会忽略UndefinedErrors,否则我将不得不添加很多

 {% if entity %}{{ entity.property }}{% endif %}
Run Code Online (Sandbox Code Playgroud)

包装.

谢谢,理查德

rat*_*ray 7

在Sean的优秀和有用的答案的基础上,我做了以下:

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
Run Code Online (Sandbox Code Playgroud)

然后env = Environment(undefined=SilentUndefined)我在那里打电话.

在我使用的django_jinja库中,以上是base.py并且实际上是对它的修改initial_params


Al *_*rad 6

我建立在@rattray 上面的回答上:

from jinja2 import Undefined, Template

class SilentUndefined(Undefined):
    def _fail_with_undefined_error(self, *args, **kwargs):
        return ''
Run Code Online (Sandbox Code Playgroud)

然后将它与模板字符串一起使用:

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'
Run Code Online (Sandbox Code Playgroud)

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


s29*_*s29 6

我还需要重置类的魔法方法以使对象属性等正常工作。添加到@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        
Run Code Online (Sandbox Code Playgroud)

成为一个 jinja 环境是有意义的。很多人都来自默认情况下是静默的 django 模板。


Sea*_*ira 5

Jinja2实际上对未定义的实体使用特殊的类。您可以Undefined从Jinja2继承该类,使其包含甚至还希望在未定义实体上使用的include __getattr__和其他属性访问器,并使它们返回空白的Unicode字符串(例如)。