2012-04-14 40 views
0

我正在尋找一種方法來擴展Django模板/視圖。如何以前瞻性的方式擴展Django視圖/模板

我第一次實現由兩種型號(clients/models.py)的:

class Client(models.Model): 
    ... 

class Address(models.Model): 
    client = models.ForeignKey(Client) 
    ... 

和其相當簡單的模板(clients/detail.html):

{{client.name}} 
Address: {{client.address.street}}, {{client.address.zipcode}} {{client.address.city}} 

爲我的應用程序的增長,新的應用誕生了:'發票。

一遍是很簡單的(invoices/models.py):

class Invoice(models.Model): 
    client = models.ForeignKey(clients.models.Client) 
    ... 

現在我的客戶信息視圖需要顯示的發票,所以我創建和我的「發票」的應用程序重寫clients/detail.html

現在有用。

後來我創建了第三個應用程序的「報價單」。 再次我的客戶詳細信息 - 查看需要顯示報價。

如果我在我的'客戶'中創建clients/detail.html我將失去顯示發票的功能。

因爲'invoices'和'quotes'app是獨立的。

我的第一個想法是創建類似於SubView類 的'invoices'和'quotes'可以擴展然後在某處註冊它們的實現。

模板應該是這樣的:

{{client.name}} 
Address: {{client.address.street}}, {{client.address.zipcode}} {{client.address.city}} 

{% for view in views %} 
    <h1>{{view.title}}</h1> 
    {{view.get_html}} 
{% endfor %} 

這是一個很好的路要走,我應該使用一個admin.site樣實施註冊我的子視圖?

回答

3

在Django的一個urlurls.py最好應使用一個view,只是爲了讓事情變得簡單。

因此,我會採用這種方法將所有需要的上下文都放在這個屏幕的一個視圖中(我想你已經通過模型中的外鍵了)。然後,而不是做你所謂的「SubView級」,我會去Django模板include tag

實施例:

{% for invoice in client.invoices %} 
    {% include "invoice-detail.html" with invoice=invoice %} 
{% endfor %} 

這使得每個發票的細節爲client的所有發票。請注意,這是如何符合DRY principle

+0

嘿喬斯維奇,理想情況下,我想保留'客戶/ detail.html'免於'發票'或'報價'的知識。謝謝你,這是一個很好的做法(+1) – 2012-04-14 12:11:25

+0

@mo。具體而言,所有的「發票」或「引號」具體知識都會放入您包含在主客戶端模板中的模板中。 – 2012-04-14 12:12:44

+0

但如果添加另一個應用程序,我不想再次更改'clients/detail.html',如果我在項目範圍內覆蓋此模板,它可能是一個選項。因爲它知道每個應用程序... – 2012-04-14 12:17:46