2009-04-24 13 views
6

Ich habe eine Website Django wie folgt:Grund MVT Problem in Django

  • Website mehrere Ansichten
  • jede Ansicht hat seine eigene Vorlage seine Daten
  • jede Vorlage eine Basisvorlage erstreckt sich zu zeigen, hat
  • Basisvorlage ist die Basis der Website, hat alle JS/CSS und das Grundlayout

Also bis jetzt ist alles gut. Jetzt haben wir also den Masterkopf der Site (der in der Basisvorlage vorhanden ist) und allen Ansichten gemein.

Aber jetzt möchte ich es dynamisch machen, und fügen Sie einige dynamische Daten hinzu. Auf welcher Seite mache ich das? Alle meine Ansichten sind im Grunde render_to_response('viewtemplate.html', someContext). Wie fügt man eine Basisansicht zu einer Basisvorlage hinzu? Offensichtlich

Ich werde nicht den gemeinsamen Code für jede separate Ansicht duplizieren ...

Ich glaube, ich bin etwas Grundsätzliches in der MVT Basis von Django fehlt.

Antwort

7

Sie möchten context_instance und RequestContext s verwenden.

from django.template import RequestContext 

Aktualisieren Sie dann alle Ihre Ansichten wie folgt aussehen::

def someview(request, ...) 
    ... 
    return render_to_response('viewtemplate.html', someContext, context_instance=RequestContext(request)) 

In Ihrem settings.py hinzu:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth', 
    ... 
    'myproj.app.context_processors.dynamic', 
    'myproj.app.context_processors.sidebar', 
    'myproj.app.context_processors.etc', 
) 

Zuerst an der Spitze Ihres views.py hinzufügen

Jede dieser context_processors ist eine Funktion nimmt die request Objekt und gibt einen Kontext in Form eines Wörterbuchs zurück. Setzen Sie einfach alle Funktionen in context_processors.py in die entsprechende App. Zum Beispiel könnte ein Blog eine Seitenleiste mit einer Liste aktueller Einträge und Kommentare enthalten. context_processors.py würde einfach definieren:

def sidebar(request): 
    recent_entry_list = Entry.objects... 
    recent_comment_list = Comment.objects... 
    return {'recent_entry_list': recent_entry_list, 'recent_comment_list': recent_comment_list} 

Sie so viele hinzufügen oder so wenig wie Sie möchten.

Für mehr, überprüfen Sie die Django Template Docs.

+2

wunderbar! Vielen Dank! ein kleiner Tippfehler im Import behoben ... –

+1

Gehen Sie nicht einfach mit Kontextprozessoren über Bord - nur Daten, die wirklich für _alle einzelne Seite verwendet werden_ gehören in einen Kontextprozessor, sonst verschwenden Sie DB-Abfragen. –

-1

oder verwenden Sie eine generic view, weil sie automatisch den Anfragekontext übergeben werden.

Eine einfache direkte Vorlage generische Ansicht kann verwendet werden, um zu vermeiden, dass der Anfragekontext importiert/übergeben werden muss.

2

Context-Prozessoren und RequestContext (siehe Tylers Antwort) sind die Vorgehensweise für Daten, die bei jedem Laden der Seite verwendet werden. Für Daten, die Sie möglicherweise für verschiedene Ansichten benötigen, aber nicht für alle (insbesondere Daten, die nicht wirklich mit dem primären Zweck der Ansicht in Zusammenhang stehen, aber in einer Navigationsleiste erscheinen), ist es oft am sinnvollsten, eine benutzerdefinierte Vorlage zu definieren Tag zum Abrufen der Daten.