2010-08-07 21 views
23

voglio essere in grado di mettere alcune informazioni di configurazione nel mio file settings.py - cose come il nome del sito, URL del sito, eccutilizzando le impostazioni di Django nei modelli

Se faccio questo, come posso quindi l'accesso quelle impostazioni nei modelli?

Grazie

risposta

44

Diciamo che nel file settings.py si hanno:

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

Se è necessario che in soli uno o due punti di vista:

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) 

Se è necessario accedere a queste attraverso molte app e/o viste, è possibile scrivere un processore di contesto per salvare il codice:

James ha un tutorial su questo online.

Alcune informazioni utili sul quando e se dei processori di contesto sono disponibili su questo stesso sito here.

Dentro il file my_context_processors.py si farebbe:

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 

Indietro nel settings.py, attivarlo facendo:

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 

    # yours 
    'my_context_processors.some_context_processor', 
) 

Nella tua views.py, fare una vista usarlo in questo modo:

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

Voglio utilizzare queste impostazioni nel mio modello di base da cui ereditano tutti gli altri, e io sono un po 'laz y. C'è un modo per rendere il comportamento predefinito in modo che render_to_response userà un RequestContext invece di un semplice Contesto? Non voglio dover continuare ad aggiungere gli stessi parametri nel mio intero codice se posso aiutarlo. – Roger

+1

Si potrebbe scrivere una funzione wrapper attorno a render_to_response che richiede la richiesta come argomento aggiuntivo, e in quella funzione: tmp_dict = RequestContext (richiesta), tmp_dict.update (response_dict) restituisce render_to_response ('... html', tmp_dict) - questo potrebbe rendere più facile la modifica del codice ovunque tramite le operazioni di ricerca e sostituzione delle copie – Geradeausanwalt

+0

è fantastico, grazie a tutti. – Roger

2

Se hai solo bisogno di un'impostazione o due per una coppia le viste, il processore di contesto potrebbe essere eccessivo poiché le aggiungerà a TUTTE le visualizzazioni nella tua app. Ma se è utilizzato in molti modelli, Processore è la strada da percorrere.

Per il semplice una tantum caso basta passare qualsiasi impostazione è necessario dal punto di vista al modello:

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 
    }) 

e accedere alla impostazione nel modello tramite:

{{ saved_setting }} 
4

Se si utilizza una classe -based view:

# 
# in settings.py 
# 
YOUR_CUSTOM_SETTING = 'some value' 

# 
# in views.py 
# 
from django.conf import settings #for getting settings vars 

class YourView(DetailView): #assuming DetailView; whatever though 

    # ... 

    def get_context_data(self, **kwargs): 

     context = super(YourView, self).get_context_data(**kwargs) 
     context['YOUR_CUSTOM_SETTING'] = settings.YOUR_CUSTOM_SETTING 

     return context 

# 
# in your_template.html, reference the setting like any other context variable 
# 
{{ YOUR_CUSTOM_SETTING }} 
Problemi correlati