1

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」を作成しました。再び私のクライアントの詳細-ビューは引用符を表示する必要があります。

「クライアント」で作成するclients/detail.htmlと、請求書を表示する機能が失われます。

「請求書」と「見積もり」アプリは独立しているためです。

私の最初のアイデアは、「請求書」と「見積もり」を拡張して、それらの実装をどこかに登録できるSubViewクラスのようなものを作成することでした。

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

{{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ですか?サブビューを登録するために-のような実装を使用する必要がありますか?

4

1 に答える 1

4

Djangoでは、物事を単純にするために、理想的には1つurlを使用する必要があります。urls.py view

したがって、この画面の1つのビューに必要なすべてのコンテキストを配置するアプローチを採用します(モデルの外部キーを介してこれをすでに持っていると思います)。次に、「SubView-class」と呼ばれるものを実行するのではなく、Djangoテンプレートのincludeタグを使用します。

例:

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

これにより、のすべての請求書の各請求書の詳細が表示されますclientこれがDRYの原則とどのように一致しているかに注意してください。

于 2012-04-14T12:08:59.563 に答える