Opzioni di Django per rendere le variabili ampiamente disponibili
Domanda
Ogni volta che apro una pagina voglio ottenere l'id del progetto attualmente attivo. Ciò avverrà eseguendo il chacking del sottodominio e verificando che l'utente attualmente connesso possa visualizzarlo.
Una volta raggiunto il mio punto di vista, voglio poterlo fare
tasks = Task.objects.filter(project = current_project)
DOVE è stato già impostato current_project (o CURRENT_PROJECT o current_project ???).
Qualcuno può spiegare i pro / contro dei vari approcci che ho trovato nei documenti e mettermi sulla buona strada?
- Sessions
- Middleware
- Threading
- builtins
Alla fine è stato così:
Decorator:
def check4project(fn):
current_project = 'fred'
def check(*args, **kw):
kw['project']=current_project
return fn(*args, **kw)
return check
Visualizza esempio
@login_required
@check4project
@tweetpost
def index(request, project=0):
print project
Soluzione
Tutto dipende da quale tua semantica del "progetto corrente" siamo. Ecco alcune possibilità:
-
Potrebbe essere una caratteristica dell'utente: visita la sua pagina del profilo e imposta un progetto corrente. Questo sarebbe archiviato nel database e si accederà con l'ORM.
-
Potrebbe essere una caratteristica dell'URL, basata esclusivamente sul sottodominio. Ciò potrebbe essere fatto con il middleware, che ha accesso alla richiesta e, ad esempio, potrebbe analizzare il nome host e impostare un attributo personalizzato sulla richiesta a cui è possibile accedere nelle funzioni di visualizzazione.
-
Simile al n. 2, è possibile utilizzare un decoratore di viste se il controllo dei progetti viene eseguito per alcune viste ma non per tutte. Questo è simile ai decoratori di Django per il controllo dell'autorizzazione.
-
Potrebbe essere una caratteristica della visita dell'utente al sito: visita una pagina di progetti, ne sceglie uno su cui lavorare ed è appiccicoso finché non sceglie un altro progetto. Questo sarebbe meglio archiviato nella sessione, che è specificamente per questo tipo di archiviazione temporanea.
Dalla tua descrizione, sembra che il numero 2 o il numero 3 siano i migliori per te, a seconda di come le tue opinioni si dividono tra cura dei sottoprogetti e non.
Altri suggerimenti
Puoi creare un context_processor e quindi ottenere il tuo valore dall'oggetto richiesta.
Hai considerato un tag modello personalizzato ?