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)
您试图任意深入到未定义的数据中.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)
| 归档时间: |
|
| 查看次数: |
1517 次 |
| 最近记录: |