2010-01-03 50 views
1

我正在研究一個網站,每個網頁上都會有一堆頁面數量不確定的「apps」。像日曆應用程序和隨機圖片應用程序,或其他任何東西,每個都在一個整潔的小盒子裏。儘管可以用一堆包含其他模板的if標籤編寫模板,但這有點麻煩。我想傳遞一些變量,並在這些應用程序的某些表單上添加表單,因此它會很快失控。編寫自定義包含標記將比{%include x%}更好,但是如果爲每個頁面編寫每個可能的應用程序並且寫出大量的聲明,它仍然會很多。Django模板中的應用程序/小部件的不確定數量

有沒有什麼辦法可以像包含標籤一樣循環,只包含那些相關的東西?我錯過了任何其他完全不同的解決方案?

我試圖避免的,我是使用{%包含%}或包含標籤,是這樣的:

{% if apps.calendar %} 
{% include "calendar.html" %} 
{% endif %} 

{% if apps.pictures %} 
{% include "pictures.html" %} 
{% endif %} 

這意味着我們不得不更新模板任何時候一個新的應用程序是添加。什麼是漂亮的是一樣的東西:

{% for app in apps %} 
{% call appropriate include or inclusion tag %} 
{% endfor %} 

回答

1

隨着我們使用自定義標記所有的地方除了極少數例外,所以我們只需將在app/__init__.py文件中的下列處理這個。

from django import template 
template.add_to_builtins('content.templatetags.local_tags') 
template.add_to_builtins('utils.cachetemplate') 

因此,所有頁面默認都可以使用它們。似乎沒有影響性能,我們使用不太可能干擾其他我們可能include的標籤名稱。這很懶,但它起作用。

更新:好吧,我想我更清楚你想要什麼。這樣做的一種方式(雖然我不真的推薦它)是將變量的檢查放入包含的模板中。這意味着您將始終擁有包含模板的開銷,但它會讓您的其他頁面更少地混亂。在你的主文件

因此,不是這樣的:

{% if apps.calendar %} 
{% include "calendar.html" %} 
{% endif %} 

您只需:

{% include "calendar.html" %} 

和 「calendar.html」 你有:

{% if apps.calendar %} 
whatever you do for your calendar app 
{% endif %} 

更新2:

您顯示的代碼的最後一位可按如下方式完成。這利用了{% include arg %}「解決」其論點的事實。這意味着它可以是一個變量或方法引用,它返回一個可用的字符串值,該字符串值是一個模板名稱。

{% for app in apps %} 
    {% include app %} <!-- or perhaps {% include app.template %} --> 
{% endfor %} 

注:Django的模板代碼不處理頂層可調用正確。這意味着您的上下文無法傳遞對函數的引用,並期望它被調用,並且在模板中引用時會插入輸出。 IE瀏覽器。在上面的例子中,您的列表apps可能不是您希望被調用的簡單函數。要按預期工作,函數引用必須是listdict的成員,或者它必須是傳遞的對象的方法。我們很早就發現了這個問題,因爲我們在緩存模板片段中使用curried functions推遲了一些重要的數據庫工作。 This ticket已開放超過2年。

+0

嗯...我不認爲我很好地解釋了我的問題。我將添加到主要描述中。 – CaptainThrowup 2010-01-04 06:08:38

+0

這仍然涉及硬編碼包括,並會要求我們每次添加新的應用程序/小部件時更新模板。我想我最終會做的是爲每個小部件製作一個render_widget方法,然後循環並調用它。 – CaptainThrowup 2010-01-13 19:53:10

相關問題