Django
Kontextprocessorer
Sök…
Anmärkningar
Använd kontextprocessorer för att lägga till variabler som är tillgängliga var som helst i dina mallar.
Ange en funktion eller funktioner som returnerar dict
för de variabler du vill ha och lägg sedan till dessa funktioner i TEMPLATE_CONTEXT_PROCESSORS
.
Använd en kontextprocessor för att komma åt inställningar.DEBUG i mallar
i myapp/context_processors.py
:
from django.conf import settings
def debug(request):
return {'DEBUG': settings.DEBUG}
i settings.py
:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.debug',
],
},
},
]
eller för versioner <1.9:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.debug',
)
Sedan i mina mallar, helt enkelt:
{% if DEBUG %} .header { background:#f00; } {% endif %}
{{ DEBUG }}
Använda en kontekstprocessor för att komma åt dina senaste blogginlägg i alla mallar
Förutsatt att du har en modell som heter Post
definierad i din models.py
fil som innehåller blogginlägg och har ett date_published
fält.
Steg 1: Skriv sammanhangsprocessorn
Skapa (eller lägg till) en fil i din context_processors.py
heter 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
Steg 2: Lägg till kontextprocessorn i din inställningsfil
Se till att du lägger till din nya settings.py
filen TEMPLATES
variabeln TEMPLATES
:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.recent_blog_posts',
],
},
},
]
(I Django-versioner före 1.9, ställdes detta direkt i settings.py
med en variabel TEMPLATE_CONTEXT_PROCESSORS
.)
Steg 3: Använd kontextprocessorn i dina mallar
Du behöver inte skicka nya blogginlägg genom enskilda vyer längre! recent_blog_posts
bara recent_blog_posts
i valfri mall.
Till exempel i home.html
du skapa en sidofält med länkar till senaste inlägg:
<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>
Eller i blog.html
du skapa en mer detaljerad visning av varje inlägg:
<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>
Utöka dina mallar
Kontextprocessor för att bestämma mallen baserad på gruppmedlemskap (eller någon fråga / logik). Detta gör att våra offentliga / vanliga användare kan få en mall och vår speciella grupp få en annan.
mittpgm / 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,
}
Lägg till sammanhangsprocessorn i dina inställningar.
Använd variabeln som definieras i kontextprocessorn i dina mallar.
{% extends site_template %}