2011-05-31 54 views
4

嗯,我没有找到答案我敢肯定,这是非常简单的,但我只是不知道如何使它像Django的工作,当它不找到一个变量jinja2:如何使它失败默默地喜欢djangotemplate

我试图用未定义和创建自己的不确定,但它给我的属性错误等

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

class UndefinedSilently(Undefined): 
    __unicode__ = silently 
    __str__ = silently 
    __call__ = silently 
    __getattr__ = silently 

的问题,但是当我尝试这个位置它失败TypeError: 'unicode' object is not callable

{%for dir_name, links in menu_links.items()%} 

回答

7

你试图随意深入你的未定义数据。 menu_links未定义,因此Jinja2会创建UndefinedSilently类的新实例。然后它调用此对象的__getattr__方法来获取items属性。这会返回一个空白的Unicode字符串。然后Python试图调用哪个Python(()menu_links.items())。这引发了unicode对象不可调用的错误。

即:

menu_links.items() # becomes 
UndefinedSilently().items() # becomes 
UndefinedSilently().u''() # from UndefinedSilently.__getattr__ 

如果你希望能够去更深比一个水平,你可以创建一个返回本身除了__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 
+0

伟大的答案,但,你有一个语法错误:在拉姆达的“回归”是没有必要的:'return_new =拉姆达*指定参数时,** kwargs:UndefinedSilently()' – sacabuche 2011-06-01 05:21:42

+2

我忘了说,我要者优先创建一个方法'def self(_self):return _self' – sacabuche 2011-06-01 05:48:47

+0

@sacabuche - 修复,谢谢! – 2011-06-01 16:32:58