2014-02-21 57 views
1

所以我有一个Jinja2扩展。基本上跟随分析器逻辑,只是我需要从解析ARGS的值在传递Jinja2扩展 - 获取传递给扩展的变量的值

举例来说,如果我有一个名为的loadFile的扩展,并把它传递一个变量:

{% loadfile "file.txt" %}

当我通过​​获取参数时,我得到一个node.Const变量,它有一个.value参数 - 我可以获得名称file.txt没问题。

但是......

{% set filename = "file.txt" %} 
{% loadfile filename %} 

使我的问题。解析器给我一个node.Name expr节点,它既不响应.value也不响应所有其他节点响应的as_const(...)调用。

我不知道如何评估我从解析参数中得到的node.Name节点的值,因此无法获得名称file.txt

是否有一种很好的方法来解析扩展中的参数变量/值,以便我可以使用它们来执行扩展?

谢谢!

+0

你'node.Name'看起来是这样的 - '姓名(名称= '文件名',CTX = '负荷')'?我认为它会这样评估:'return nodes.Output([nodes.MarkSafeIfAutoescape(self.call_method('your_method',args))])。set_lineno(lineno)',and method:'def your_method(self ,文件名):' – erthalion

+0

为什么你需要一个扩展。您可以使用返回内容或使用include的Python函数。 – voscausa

+0

@voscausa的扩展做了一些更复杂的事情,我只是简化了示例以清楚地说明问题。 –

回答

1

这对我的作品

def parse(self, parser): 
    lineno = parser.stream.next().lineno 

    # args will contains filename 
    args = [parser.parse_expression()] 

    return nodes.Output([ 
     nodes.MarkSafeIfAutoescape(self.call_method('handle', args)) 
    ]).set_lineno(lineno) 

def handle(self, filename): 
    # bla-bla-bla 
+0

这给了我一个'''AttributeError:'环境'对象没有'call''''属性,但我必须在模板渲染循环某处... –

+0

我想我很困惑,为什么变量不是在被传递给扩展/功能之前进行评估。 –