2009-02-11 53 views
3

我使用Jinja2的,我試圖創建工作在一起的夫婦的標籤,例如,如果我有一個模板,看起來是這樣的:如何在Jinja中創建包含模板中以後的值的標籤?

{{ my_summary() }} 
... arbitrary HTML ... 
{{ my_values('Tom', 'Dick', 'Harry') }} 
... arbitrary HTML ... 
{{ my_values('Fred', 'Barney') }} 

我想最終以下:

This page includes information about <b>Tom</b>, <b>Dick</b>, <b>Harry</b>, <b>Fred</b>, and <b>Barney</b>. 
... arbitrary HTML ... 
<h1>Tom, Dick, and Harry</h1> 
... arbitrary HTML ... 
<h1>Fred and Barney</h1> 

換句話說,頁面開頭的my_summary()包含稍後在頁面中提供的信息。考慮到includeimport語句中出現的表達式,它應該足夠聰明。

這樣做的最好方法是什麼?

+0

@Chris B.有一點不清楚的是值的列表來自哪裏?你知道模板渲染前的子列表嗎?如果您在那時不知道他們,這似乎表明您的模板正在承擔控制器的責任(鬆散地講就MVC而言)。 – 2009-02-16 22:30:39

+0

我基本上使用包含的模板繪製小部件,它需要某些css和js文件才能運行。 css和js進入基本模板,而後來包含的模板渲染小部件。因此,先前無法知道,稍後會需要哪些庫。 – 2009-02-18 04:02:00

回答

4

聲明:我不知道Jinja。

我的猜測是你不能(很容易)完成這個。

我建議以下選擇:

  • 傳湯姆,迪克等值作爲變量從外部的模板。
  • 讓您的自定義標籤將值作爲參數。
  • 我不知道你的情況會是什麼「外部」。如果模板用於Web應用程序框架中,「外部」可能是一種控制器方法。
  • 例如:

模板:

 
{{ my_summary(list1 + list2) }} 
... arbitrary HTML ... 
{{ my_values(list1) }} 
... arbitrary HTML ... 
{{ my_values(list2) }} 

控制器:

 
def a_controller_method(request): 
    return render_template('templatefilename', { 
     'list1': ['Dick', 'Tom', 'Harry'], 
     'list2': ['Fred', 'Barney']}) 
  • 如果從外界傳遞的價值觀是不可行的,我建議你在定義它們您的模板頂部,如下所示:
 
{% set list1 = ['Dick', ...] %} 
{% set list2 = ['Fred', ...] %} 
{{ my_summary(list1 + list2) }} 
... arbitrary HTML ... 
{{ my_values(list1) }} 
... arbitrary HTML ... 
{{ my_values(list2) }} 
相關問題