Jinja2忽略未找到对象的未定义错误

2024-05-13 00:21:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

 {{ entity.property }}

如果未定义实体。在某些情况下是否可以忽略未定义的错误,否则我将不得不添加很多

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

包装纸。

谢谢, 理查德


Tags: django实体模板if错误情况property包装纸
3条回答

基于肖恩出色而有益的回答,我做了以下工作:

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戋ujinja库中,上面的内容位于base.py中,实际上是initial_params的修改

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

Jinja2实际上为未定义的实体使用了一个特殊的类。您可以从Jinja2将这个^{}类划分为子类,以包括__getattr__和其他attribute accessors,甚至可以在未定义的实体上使用它们,并让它们返回一个空的unicode字符串(例如)。

相关问题 更多 >