2012-07-25 154 views
4

我已經設法通過使用自定義過濾器從jinja2調用python函數,但我似乎只能用一個或多個參數調用函數。在下面,我必須傳遞一個垃圾參數才能將ctest作爲一個函數而不是一個變量。如何調用jinja2模板中沒有參數的python函數

如果我打電話給{{ ctest() }},它也不起作用。

是否有不同的方式強制這是一個函數調用,或者我應該使用不同的方法?

代碼:

def ctest(stuff): 
    return "yeah!" 

template_env = jinja2.Environment (loader = jinja2.FileSystemLoader(template_file_root)) 
#custom filters 
template_env.filters['ctest'] = ctest 

模板:

Working? {{ junk|ctest }} 

輸出:

working? yeah! 
+0

可能重複[調用從Jinja2的一個Python函數(http://stackoverflow.com/questions/6036082/call-a-python-function-from-jinja2) – geoffspear 2012-07-25 19:41:22

+0

我在發佈之前查看了這個問題,但並未解釋如何在不帶參數的模板中調用過濾器。它只是解釋瞭如何達到我已經在的程度。 – chrisst 2012-07-25 21:00:09

+0

看到第二個答案:'{{clever_function()}}' – geoffspear 2012-07-25 22:40:04

回答

1

總結各種意見,回答:

將其添加到過濾器調用功能的能力是不是真的,因爲要對這個正確的方法(如Wooble指出的),我不希望過濾任何東西。

取而代之的是功能只需要被添加到template_env.globals:

template_globals.filters['ctest'] = ctest 
0

那麼,他們是過濾器,所以他們期望得到的東西過濾。如果動機是要發揮作用是從模板外調用沒有傳遞任何參數,簽名改爲:

def ctest(*args): 

,然後忽略的參數;如果它沒有傳遞任何參數或任何數量的參數,它就會工作。

+1

上面的例子適用於我,但我仍然想調用零參數方法。 我希望能夠調用其他python庫而不必編寫包裝方法。特別是我試圖調用socket.gethostname()。 – chrisst 2012-07-25 19:39:08

+0

你好,從未來大聲笑 你有沒有嘗試過使用lambda?我理解它本質上是包裝一個功能,但比平常少打字。 我厭倦了這個'tempEnv.globals ['test'] = lambda:socket.gethostname()'它工作。 – 2016-11-06 13:31:33

0

{{func()}}渲染輸出。 {% call func() %}{%endcall%}使用caller參數調用func()

在jinja中真的好像沒有直接的方法來調用模板中的python函數,而不會呈現它或其他模板副作用。我想出瞭解決方法是:

{% if func() %}{% endif %} 
相關問題