2010-03-18 65 views
37

我傳遞給Django的模板一個函數,它返回一些記錄。 我想調用這個函數並迭代它的結果。如何調用在Django模板中引用參數的函數?

{% for item in my_func(10) %} 

這是行不通的。 我試着將函數的返回值設置爲一個變量並迭代變量,但似乎沒有辦法在Django模板中設置變量。

有沒有正常的方法來做到這一點?

回答

47

您無法調用模板中需要參數的函數。 Write改爲模板標記或過濾器。

+57

很傷心。我想要一個更簡單的方法。 – cleg 2010-03-18 17:16:33

+1

我認爲使用內建的python'@ property'解決方案是更好的解決方案,當然,這取決於具體情況。 – jrast 2014-05-04 11:02:35

+0

是的,但是這並不能解決問題。如果Django不需要參數,它會自動調用函數。寫作'{%的項目在MYFUNC%}'等同於'在MYFUNC項目()'如果MYFUNC是不帶參數的函數。 Django的唯一真正的限制是調用需要的參數,它'@ property'不能解決的功能(但無可否認,你可以在模板中設置一些屬性,並把它們作爲參數,但不是特別乾淨要麼) – matts1 2014-12-17 04:48:14

8

我傳遞給Django的模板函數,它返回我的一些記錄

你爲什麼不傳給Django的模板變量存儲函數的返回值,而不是功能?


我試圖機能的研究的返回值設置爲一個變量和迭代變量,但似乎沒有辦法設置變量在Django模板。

您應該在Django視圖中設置變量而不是模板,然後將它們傳遞給模板。

+0

該函數返回一些記錄,參數是它們的計數。 我想控制從模板此值。 – cleg 2010-03-26 21:31:20

+2

如果你想成爲什麼懶洋洋地評估的功能?例如你希望結果在需要的時候可用,但是你不想毫無計算的結果?我想我堅持寫作模板標籤.. – Rob 2011-07-26 13:50:25

2

按照設計,Django模板不能調用任意的Python代碼。這是設計人員編寫模板的環境的安全和安全功能,同時也防止業務邏輯遷移到模板中。

如果你想這樣做,你可以切換到使用Jinja2模板(http://jinja.pocoo.org/docs/),或者任何你喜歡的模板系統來支持它。 django的其他部分不會受到您使用的模板的影響,因爲它是故意單向過程。如果您願意,您甚至可以在同一個項目中使用許多不同的模板系統。

15

如果你有一個對象,你可以定義它爲@property,這樣你就可以在沒有呼叫的情況下得到結果,例如,

class Item: 
    @property 
    def results(self): 
     return something 

然後在模板:

<% for result in item.results %> 
... 
<% endfor %> 
+0

你有這個@sherpya的參考? – bozdoz 2014-03-01 02:43:40

+2

蟒蛇內置屬性http://docs.python.org/2/library/functions.html#property – sherpya 2014-03-01 03:23:44

+0

不一樣的。數組中的東西可以是不同類的項目。 – kentor 2015-08-24 22:57:54

1

你可以做的是,創造了「功能」作爲另一個模板文件,然後包括文件傳遞參數給它。

裏面的index.html

<h3> Latest Songs </h3> 
{% include "song_player_list.html" with songs=latest_songs %} 

內song_player_list.html

<ul> 
{% for song in songs %} 
<li> 
<div id='songtile'> 
<a href='/songs/download/{{song.id}}/'><i class='fa fa-cloud-download'></i>&nbsp;Download</a> 

</div> 
</li> 
{% endfor %} 
</ul> 
+0

我怎樣才能控制'{%include「song_player_list.html」with songs = latest_songs%}「'只有當按鈕被點擊時才能執行。我試圖把它放在一個函數中,但是'Django模板'在我每次加載頁面時都執行它。 – 2017-05-30 07:37:12

相關問題