2011-05-31 53 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