2010-08-07 13 views
23

Ich möchte in meiner settings.py Datei bestimmte Konfigurationsinformationen setzen können - Dinge wie die Site-Namen, URL-Website usw.Mit Django-Einstellungen in Vorlagen

Wenn ich dies tun, wie kann ich dann Zugang diese Einstellungen in Vorlagen?

Dank

Antwort

44

die in Ihrer settings.py Datei Lassen Sie sagen, Sie haben:

SITE_URL='www.mydomain.tld/somewhere/' 
SITE_NAME='My site' 

Wenn Sie, dass in nur ein oder zwei Ansichten:

from django.shortcuts import render_to_response 
from django.conf import settings 

def my_view(request, ...): 
    response_dict = { 
     'site_name': settings.SITE_NAME, 
     'site_url': settings.SITE_URL, 
    } 
    ... 
    return render_to_response('my_template_dir/my_template.html', response_dict) 

Wenn Sie müssen Um diese auf viele Apps und/oder Ansichten zuzugreifen, können Sie einen Kontextprozessor schreiben, um Code zu speichern:

James hat ein Tutorial zu diesem online.

Einige nützliche Informationen zu den Kontextprozessoren wann und ob ist auf dieser Website here verfügbar.

In Ihrem my_context_processors.py Datei, die Sie würde:

from django.conf import settings 

def some_context_processor(request): 
    my_dict = { 
     'site_url': settings.SITE_URL, 
     'site_name': settings.SITE_NAME, 
    } 

    return my_dict 

Zurück in Ihrem settings.py, aktivieren Sie es, indem Sie:

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 

    # yours 
    'my_context_processors.some_context_processor', 
) 

In Ihrem views.py, eine Ansicht, es wie so verwenden machen:

from django.shortcuts import render_to_response 
from django.template import RequestContext 

def my_view(request, ...): 
    response_dict = RequestContext(request) 
    ... 
    # you can still still add variables that specific only to this view 
    response_dict['some_var_only_in_this_view'] = 42 
    ... 
    return render_to_response('my_template_dir/my_template.html', response_dict) 
+1

Ich möchte diese Einstellungen in meiner Basisvorlage verwenden, von der alle anderen erben, und ich bin ein wenig laz y. Gibt es eine Möglichkeit, das Standardverhalten so zu machen, dass render_to_response einen RequestContext anstatt nur einen Kontext verwendet? Ich möchte nicht die gleichen Parameter in meinem gesamten Code hinzufügen müssen, wenn ich Ihnen helfen kann. – Roger

+1

Sie könnten eine Wrapper-Funktion um render_to_response schreiben, die die Anfrage als zusätzliches Argument akzeptiert, und in dieser Funktion: tmp_dict = RequestContext (Anfrage), tmp_dict.update (Antwort_dict) return render_to_response ('... html', tmp_dict) - dies könnte Erleichtern Sie es, Ihren Code überall zu ändern, indem Sie die Such- und Ersetzen-Funktion verwenden. – Geradeausanwalt

+0

das ist großartig, danke an alle. – Roger

2

Wenn Sie nur eine Einstellung oder zwei für ein Paar benötigen Views, Context Processor kann übertrieben sein, da es zu ALLEN Ansichten in Ihrer App hinzugefügt wird. Aber wenn es in vielen Vorlagen verwendet wird, ist der Wettbewerbsprozessor der richtige Weg.

Für den einfachen einmaligen Fall passieren nur, was Sie an die Vorlage müssen aus der Sicht Einstellung:

from django.conf import settings 
from django.shortcuts import render_to_response 

def some_view(request): 
    val = settings.SAVED_SETTING 
    return render_to_response("index.html", { 
     'saved_setting':val 
    }) 

und Zugriff auf die Einstellung in Ihrer Vorlage über:

{{ saved_setting }} 
4

Wenn eine Klasse mit -basierte Ansicht: