2012-04-14 5 views
0

Ich suche nach einer Möglichkeit, eine Django Vorlage/Ansicht zu erweitern.Wie django Ansichten/Vorlagen auf eine zukunftsorientierte Weise zu erweitern

meine erste Implementierung besteht aus zwei Modellen (clients/models.py):

class Client(models.Model): 
    ... 

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

und seine ziemlich einfachen Vorlage (clients/detail.html):

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

wie meine Anwendung wächst, eine neue App geboren wurde: ' Rechnungen ".

es ist wieder sehr einfach (invoices/models.py):

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

jetzt braucht meine Kunden Details-Ansicht Rechnungen angezeigt werden, so dass ich erstellen und außer Kraft setzen clients/detail.html in meiner app 'Rechnungen'.

gut für jetzt.

später habe ich eine dritte App 'Zitate' erstellt. wieder meine Kunden details-view muss Anführungszeichen anzeigen.

Wenn ich clients/detail.html in meinen "Kunden" erstelle, verliere ich die Fähigkeit, Rechnungen anzuzeigen.

weil die apps 'rechnungen' und 'anführungszeichen' unabhängig sind.

meine erste Idee war es, etwas wie eine SubView-Klasse zu erstellen, die "Rechnungen" und "Zitate" erweitern und dann ihre Implementierung irgendwo registrieren können.

eine Vorlage sollte wie folgt aussehen:

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

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

ist dies ein guter Weg, um meine Unteransichten i verwenden, um eine admin.site -ähnliche Implementierung zu gehen und sollte für die Registrierung?

Antwort

3

In Django ein url in urls.py ideal einview, nur die Dinge einfach zu halten, verwenden sollten.

Ich würde daher den Ansatz, setzen alle erforderlichen Kontext in Ihre eine Ansicht für diesen Bildschirm (ich denke, Sie haben dies bereits über Fremdschlüssel in Ihrem Modell). Dann würde ich, anstatt das zu tun, was Sie "SubView-Klasse" nennen, nach der Django-Vorlage include tag suchen.

Beispiel:

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

Diese jedes Detail der Rechnung macht für alle Rechnungen des client. Beachten Sie, wie dies in Übereinstimmung mit der DRY principle ist.

+0

hey josvic, idealerweise möchte ich die 'clients/detail.html' frei von Wissen über 'Rechnungen' oder 'Zitate' halten. danke trotzdem. Es ist eine gute Praxis (+1) –

+0

@mo. Genau, alle "Rechnungen" oder "Zitate" spezifischen Kenntnisse würden in die Vorlagen gehen, die Sie in der Hauptvorlage "client" einschließen. –

+0

aber wenn ich eine andere App hinzufüge, möchte ich 'clients/detail.html' nicht noch einmal ändern.Es könnte eine Option sein, wenn ich diese Vorlage projektweit überschreibe.Denn dann kennt es jede App ... –

Verwandte Themen