我从Django切换到Jinja但是在引用时我的很多模板都坏了
{{ entity.property }}
Run Code Online (Sandbox Code Playgroud)
如果实体未定义.在某些情况下是否会忽略UndefinedErrors,否则我将不得不添加很多
{% if entity %}{{ entity.property }}{% endif %}
Run Code Online (Sandbox Code Playgroud)
包装.
谢谢,理查德
在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
我建立在@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)
当直接从字符串渲染模板而不是使用环境时,我需要忽略错误。
我还需要重置类的魔法方法以使对象属性等正常工作。添加到@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 模板。
| 归档时间: |
|
| 查看次数: |
6300 次 |
| 最近记录: |