Django
Contextprocessors
Zoeken…
Opmerkingen
Gebruik contextprocessors om variabelen toe te voegen die overal in uw sjablonen toegankelijk zijn.
Geef een functie of functies op die dict
van de gewenste variabelen retourneren en voeg die functies vervolgens toe aan TEMPLATE_CONTEXT_PROCESSORS
.
Gebruik een contextprocessor om toegang te krijgen tot instellingen. DEBUG in sjablonen
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',
],
},
},
]
of, voor versies <1.9:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.debug',
)
Dan in mijn sjablonen, eenvoudig:
{% if DEBUG %} .header { background:#f00; } {% endif %}
{{ DEBUG }}
Een contextprocessor gebruiken om toegang te krijgen tot uw meest recente blogberichten in alle sjablonen
Ervan uitgaande dat u een model met de naam Post
gedefinieerd in uw models.py
bestand dat blogberichten bevat en een veld date_published
heeft.
Stap 1: Schrijf de contextprocessor
Maak (of voeg toe aan) een bestand in uw app-directory met de naam 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
Stap 2: Voeg de contextprocessor toe aan uw instellingenbestand
Zorg ervoor dat u uw nieuwe contextprocessor toevoegt aan uw bestand settings.py
in de variabele TEMPLATES
:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.recent_blog_posts',
],
},
},
]
(In Django-versies vóór 1.9 werd dit rechtstreeks ingesteld in settings.py
met behulp van een variabele TEMPLATE_CONTEXT_PROCESSORS
.)
Stap 3: Gebruik de contextprocessor in uw sjablonen
U hoeft recente blogberichten niet meer door individuele weergaven te halen! Gebruik gewoon recent_blog_posts
in elke sjabloon.
In home.html
kunt u bijvoorbeeld een zijbalk maken met links naar recente berichten:
<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>
Of in blog.html
kun je een meer gedetailleerde weergave van elk bericht maken:
<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>
Uw sjablonen uitbreiden
Contextprocessor om de sjabloon te bepalen op basis van groepslidmaatschap (of een query / logica). Hiermee kunnen onze openbare / vaste gebruikers een sjabloon krijgen en onze speciale groep een andere.
myapp / 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,
}
Voeg de contextprocessor toe aan uw instellingen.
Gebruik in uw sjablonen de variabele die in de contextprocessor is gedefinieerd.
{% extends site_template %}