2012-09-18 16 views
2

任何瓦片樣的概念,我在Django尋找以下特徵是否有在Django

我寫一個網站,它包含了許多網頁例如:家庭(顯示所有的書籍),細節(選擇書的詳細信息),搜索(基於搜索顯示書籍)。

現在主頁包含特色書籍,剛入書籍,最着名的書籍等區塊。 詳細信息頁面顯示所選書籍的詳細信息,並應顯示特色書籍,最着名的書籍。

現在我的問題是有特色的,着名的書籍塊正在重複,所以有什麼辦法分開保存模板代碼(html)和各自的查看方法。所以如果我使用參數從主模板中調用這些迷你模板。

爲了讓我可以保持更通用的方式,並且在將來也不重複代碼,如果我想改變某些東西,我可以在一個地方做到這一點。

我想用過濾器來做,但這是一個好方法嗎?或Django提供任何機制?

回答

4

您可以將可重複使用的HTML塊分離爲模板,然後使用{% include %}標記將它們包含在其他模板中。

他們不帶參數的,但你可以設置主模板,以便變量的設置是否正確,或使用{% with %}標籤設置前{% include %}

的情況下作爲一個具體的例子,你的視圖代碼可以成立的書籍列表如下:

def book_detail_view(request, book_id): 
    # Get the main book to display 
    book = Book.objects.get(id=book_id) 
    # Get some other books 
    featured_books = Book.objects.filter(featured=True).exclude(id=book_id) 
    just_in_books = Book.objects.filter(release_data__gte=last_week, featured=False).exclude(id=book_id) 

    return render("book_template.html", 
        dict(book=book, 
         featured_books=featured_books, 
         just_in_books=just_in_books)) 

然後,在你的模板(book_template.html):

<h1>Here's your book</h1> 
<!-- fragment uses a context variable called "book" --> 
{% include "book_fragment.html" %} 

<h2>Here are some other featured books:</h2> 
{% for featured_book in featured_books %} 
    <!--Temporarily define book to be the featured book in the loop --> 
    {% with featured_book as book %} 
     {% include "book_fragment.html" %} 
    {% endwith %} 
{% endfor %} 

<h2>Here are some other books we just received:</h2> 
<!-- This is a different way to do it, but might overwrite 
    the original book variable --> 
{% for book in just_in_books %} 
    {% include "book_fragment.html" %} 
{% endfor %} 
+0

如果我們使用include和with tags,在這兩種情況下,我們都必須從主模板的視圖函數將對象傳遞給迷你模板。所以它又緊密耦合了嗎? 是否有任何其他方式,我可以從主模板帶有參數調用迷你模板,以便內部它將轉到該特定的視圖函數並返回響應? 但你的解決方案也是可以接受的,因爲現在我只做這樣一種方式。 –

+0

您應始終在視圖函數中設置對象本身,但您可以在模板中以不同方式使用它們。而且該視圖甚至不一定需要了解迷你模板。 –

+0

其他一些想法出現在我身上。 1)爲您的主視圖設置'精選圖書'混合,或2)使用JavaScript加載精選圖書子模板,並在獨立請求中加載視圖函數。這是不太可能的(據我所知)使用兩個視圖函數來處理請求 – mklauber

1

這是template tags的用途。一旦您編寫了適當的包含標籤,您可以簡單地執行{% load books %} ... {% newbooks %} .. {% featuredbooks %} ... etc.以將包含相關信息的div放在任何需要的位置。

+0

所以你的意思是說寫一些自定義標籤? –

+0

正確。這樣,當事情發生變化時,您不必擔心拼寫錯誤,因爲Django要求存在模板標籤(並且引導時間較短)。另外,您可以將模板上下文傳遞給標籤,這在使用'{%include%}'時是不可能的。 –

+0

所以你的意思是說寫一些自定義標籤? 如果是,那麼我們如何在主模板中獲得迷你模板響應。 如果我們調用{%load books%},它會返回一些書本對象嗎? 還是我們寫書功能來返回html內容? 請不要感到不好,因爲我正在問更多的問題,只是爲了清楚的想法。即使它會幫助許多像我一樣掙扎的人。 如果可能,請提供像「Ian Clelland」提供的方式。 –

相關問題