jinja2:如何让它失败像djangotemplate一样无声

sac*_*che 5 python django-templates jinja2

好吧,我没有找到答案,我确信这很简单,但我只是没有找到如何让它像Django一样工作,因为它找不到变量

我试图使用Undefined并创建我自己的undefined但它给我带来属性错误等问题.

def silently(*args, **kwargs):
    return u''

class UndefinedSilently(Undefined):
    __unicode__ = silently
    __str__ = silently
    __call__ = silently
    __getattr__ = silently
Run Code Online (Sandbox Code Playgroud)

但是当我在这里尝试它失败时TypeError: 'unicode' object is not callable:

{%for dir_name, links in menu_links.items()%}
Run Code Online (Sandbox Code Playgroud)

Sea*_*ira 9

您试图任意深入到未定义的数据中.menu_links未定义,因此Jinja2创建了一个新UndefinedSilently类的实例.然后它调用__getattr__此对象的方法来获取items属性.这将返回一个空的unicode字符串.哪一种Python然后试图调用(在()menu_links.items()).这引发了unicode对象不是callables的错误.

那是:

menu_links.items() # becomes
UndefinedSilently().items() # becomes
UndefinedSilently().u''() # from UndefinedSilently.__getattr__
Run Code Online (Sandbox Code Playgroud)

如果您希望能够深入到一个级别,则可以创建一个类,该类可以为每个访问尝试返回自己,除了__str____unicode__.

def silently(*args, **kwargs):
    return u''

return_new = lambda *args, **kwargs: UndefinedSilently()

class UndefinedSilently(Undefined):
    __unicode__ = silently
    __str__ = silently
    __call__ = return_new
    __getattr__ = return_new
Run Code Online (Sandbox Code Playgroud)

  • 我忘了说我更喜欢创建一个方法`def self(_self):return _self` (2认同)