2014-02-21 69 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

我想我很困惑,爲什麼變量不是在被傳遞給擴展/功能之前進行評估。 –