2012-04-14 2 views
0

私はdjangoテンプレート/ビューを拡張する方法を探しています。djangoビュー/テンプレートを前方に見せる方法

私の最初の実装は、次の2つのモデル(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をオーバーライドします。

今のところ良いです。

私は3番目のアプリ 'quotes'を作成しました。 私のクライアントのdetails-viewは引用符を表示する必要があります。

私が 'クライアント'にclients/detail.htmlを作成すると、請求書を表示する能力が失われます。

「請求書」と「引用符」アプリが不自然なためです。

私の最初のアイデアは、サブビュークラス のようなものを作成し、「請求書」と「引用符」を拡張してどこかの実装を登録することでした。

テンプレートは次のようになります。

{{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様の実装を使用する必要がありますか? urls.pyでジャンゴ1 url

答えて

3

は、理想的には、単に物事をシンプルに保つために、1viewを使用する必要があります。

したがって、この画面では、すべての必要なコンテキストをに表示するというアプローチを採用しています(モデル内の外部キーを使用していると思います)。次に、あなたが「SubViewクラス」と呼ぶものを行うのではなく、私はDjangoテンプレートinclude tagを探します。

例:

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

これはclientのすべての請求書の各請求書の詳細をレンダリングします。これがDRY principleとどのように一致しているかに注目してください。

+0

ちょっと、私は 'clients/detail.html'を '請求書'や '引用符'についての知識から解放したいと思っています。とにかくありがとうございます。これは良い練習です(+1) –

+0

@moです。正確には、すべての '請求書'や '引用符'の知識は、メインの 'client'テンプレートに' include'するテンプレートに入ります。 –

+0

しかし、別のアプリケーションを追加する場合、私は 'clients/detail.html' again.itを変更したくありません。このテンプレートをプロジェクト全体でオーバーライドするとオプションになる可能性があります。それはすべてのアプリを知っているからです... –

関連する問題