Django
Processori di contesto
Ricerca…
Osservazioni
Utilizza processori di contesto per aggiungere variabili accessibili ovunque nei tuoi modelli.
Specificare una funzione, o funzioni che restituiscono le dict
delle variabili desiderate, quindi aggiungere tali funzioni a TEMPLATE_CONTEXT_PROCESSORS
.
Utilizzare un processore di contesto per accedere alle impostazioni.DEBUG nei modelli
in myapp/context_processors.py
:
from django.conf import settings
def debug(request):
return {'DEBUG': settings.DEBUG}
in settings.py
:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.debug',
],
},
},
]
oppure, per le versioni <1.9:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.debug',
)
Quindi nei miei modelli, semplicemente:
{% if DEBUG %} .header { background:#f00; } {% endif %}
{{ DEBUG }}
Utilizzo di un processore di contesto per accedere alle voci del blog più recenti in tutti i modelli
Supponendo che tu abbia un modello definito Post
definito nel tuo file models.py
che contiene post di blog e che abbia un campo date_published
.
Passaggio 1: scrivere il processore di contesto
Crea (o aggiungi a) un file nella tua directory app denominata context_processors.py
:
from myapp.models import Post
def recent_blog_posts(request):
return {'recent_posts':Post.objects.order_by('-date_published')[0:3],} # Can change numbers for more/fewer posts
Passaggio 2: aggiungere il processore di contesto al file delle impostazioni
Assicurati di aggiungere il nuovo processore di contesto al file settings.py
nella variabile TEMPLATES
:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.recent_blog_posts',
],
},
},
]
(Nelle versioni di Django precedenti alla 1.9, questo era impostato direttamente in settings.py
usando una variabile TEMPLATE_CONTEXT_PROCESSORS
.)
Passaggio 3: utilizzare il processore di contesto nei modelli
Non è più necessario passare più recenti post di blog attraverso le singole visualizzazioni! Basta usare recent_blog_posts
in qualsiasi modello.
Ad esempio, in home.html
puoi creare una barra laterale con link a post recenti:
<div class="blog_post_sidebar">
{% for post in recent_blog_posts %}
<div class="post">
<a href="{{post.get_absolute_url}}">{{post.title}}</a>
</div>
{% endfor %}
</div>
Oppure in blog.html
potresti creare una visualizzazione più dettagliata di ogni post:
<div class="content">
{% for post in recent_blog_posts %}
<div class="post_detail">
<h2>{{post.title}}</h2>
<p>Published on {{post.date_published}}</p>
<p class="author">Written by: {{post.author}}</p>
<p><a href="{{post.get_absolute_url}}">Permalink</a></p>
<p class="post_body">{{post.body}}</p>
</div>
{% endfor %}
</div>
Estendere i tuoi modelli
Processore di contesto per determinare il modello in base all'appartenenza al gruppo (oa qualsiasi query / logica). Ciò consente ai nostri utenti pubblici / regolari di ottenere un modello e il nostro gruppo speciale per ottenerne uno diverso.
frontend / context_processors.py
def template_selection(request):
site_template = 'template_public.html'
if request.user.is_authenticated():
if request.user.groups.filter(name="some_group_name").exists():
site_template = 'template_new.html'
return {
'site_template': site_template,
}
Aggiungi il processore di contesto alle tue impostazioni.
Nei modelli, utilizzare la variabile definita nel processore di contesto.
{% extends site_template %}