I processori di contesto sono più adatti alla gestione di dati di oggetti più dinamici: sono definiti come una mappatura nello documentation e in molti dei post qui vengono modificati o passati alle viste - non lo fa ha senso che un modello possa perdere l'accesso alle informazioni globali perché, ad esempio, si è dimenticato di utilizzare un processore di contesto specializzato nella vista. I dati sono globali per definizione & che accoppia la vista al modello.
Un modo migliore è definire un tag modello personalizzato.In questo modo:
- modelli non si affidano a vista di avere informazioni globali passato nelle loro
- è asciutto-er: l'applicazione che definisce le impostazioni globali possono essere esportati in molti progetti, eliminando codice comune tra i progetti
- modelli di decidere se hanno accesso alle informazioni a livello mondiale, non le funzioni di visualizzazione
nell'esempio qui sotto ho a che fare con il tuo problema - di carico in questo MIN_TIME_TEST variabili - e un problema che comunemente faccia, carico in URL che cambiano quando il mio ambiente c HANGES.
Ho 4 ambienti - 2 dev e 2 produzione:
- Dev: Django server Web, url: localhost: 8000
- Dev: web server Apache: url: sandbox.com -> delibera di 127.0.0.1
- server di sandbox Prod, url: sandbox.domain.com
- Prod server: url: domain.com
Lo faccio in tutti i miei progetti & conserva tutti gli URL in un file, global_settings.py in modo che sia accessibile dal codice. Definisco un tag modello personalizzato {% site_url%} che può essere (facoltativamente) caricato in qualsiasi modello
Creo un'app chiamata global_settings e assicurati che sia inclusa nelle mie impostazioni.INSTALLED_APPS tupla.
Django compila il testo su modelli in nodi con un metodo render(), che spiega come devono essere visualizzati i dati -. Ho creato un oggetto che rende i dati da returnning valori nel mio global_settings.py in base al nome passato in
Ecco come si presenta:
from django import template
import global_settings
class GlobalSettingNode(template.Node):
def __init__(self, settingname):
self.settingname = settingname;
def render(self, context):
if hasattr(global_settings, self.settingname):
return getattr(global_settings, self.settingname)
else:
raise template.TemplateSyntaxError('%s tag does not exist' % self.settingname)
Ora, in global_settings.py registro un paio di tag: site_url per il mio esempio e min_test_time per il vostro esempio. In questo modo, quando {% min_time_test%} viene richiamato da un modello, chiamerà get_min_time_test che risolve il caricamento nel valore = 5. Nel mio esempio, {% site_url%} eseguirà una ricerca basata sul nome in modo da poter mantenere tutti e 4 gli URL definiti contemporaneamente e scegliere l'ambiente che sto utilizzando. Questo per me è più flessibile del semplice utilizzo delle impostazioni integrate di Django.Debug = True/False flag.
from django import template
from templatenodes import GlobalSettingNode
register = template.Library()
MIN_TIME_TEST = 5
DEV_DJANGO_SITE_URL = 'http://localhost:8000/'
DEV_APACHE_SITE_URL = 'http://sandbox.com/'
PROD_SANDBOX_URL = 'http://sandbox.domain.com/'
PROD_URL = 'http://domain.com/'
CURRENT_ENVIRONMENT = 'DEV_DJANGO_SITE_URL'
def get_site_url(parser, token):
return GlobalSettingNode(CURRENT_ENVIRONMENT)
def get_min_time_test(parser, token):
return GlobalSettingNode('MIN_TIME_TEST')
register.tag('site_url', get_site_url)
register.tag('min_time_test', get_min_time_test)
Si noti che per questo lavoro, Django si aspetta global_settings.py per essere collocata in un pitone confezionato chiamato templatetags sotto il Django app. Il mio Django applicazione qui si chiama global_settings, quindi la mia struttura di directory si presenta come:
/project-name/global_settings/templatetags/global_settings.py ecc
Infine il modello sceglie se caricare nelle impostazioni globali o no , che è vantaggioso per le prestazioni. Aggiungi questa linea al tuo modello per esporre tutti i tag registrati in global_settings.py:
{% load global_settings %}
Ora, altri progetti che hanno bisogno MIN_TIME_TEST o questi ambienti esposti può semplicemente installare questa app =)
Grazie, è davvero la direzione che voglio andare. Ma per favore vedi il mio chiarimento/altra domanda, ad esempio, come posso fare ciò che dici senza dover elencare tutte le costanti due volte? –
Avvolgili tutti in un dizionario quindi inserisci il dizionario nel contesto. Li accederai tramite notazione dot. es .: {{yourDict.yourConstant}} –