Django
Procesory kontekstowe
Szukaj…
Uwagi
Użyj procesorów kontekstowych, aby dodać zmienne, które są dostępne w dowolnym miejscu w szablonach.
Określ funkcję lub funkcje, które zwracają dict
zmienne, a następnie dodaj te funkcje do TEMPLATE_CONTEXT_PROCESSORS
.
Użyj procesora kontekstu, aby uzyskać dostęp do ustawień. DEBUG w szablonach
w myapp/context_processors.py
:
from django.conf import settings
def debug(request):
return {'DEBUG': settings.DEBUG}
w settings.py
:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.debug',
],
},
},
]
lub, dla wersji <1.9:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.debug',
)
Następnie w moich szablonach po prostu:
{% if DEBUG %} .header { background:#f00; } {% endif %}
{{ DEBUG }}
Korzystanie z procesora kontekstu w celu uzyskania dostępu do najnowszych wpisów blogu we wszystkich szablonach
Zakładając, że masz model o nazwie Post
zdefiniowany w pliku models.py
, który zawiera posty na blogu i ma pole date_published
.
Krok 1: Napisz procesor kontekstowy
Utwórz (lub dodaj do) plik w katalogu aplikacji o nazwie 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
Krok 2: Dodaj procesor kontekstowy do pliku ustawień
Upewnij się, że dodajesz nowy procesor kontekstowy do pliku settings.py
w zmiennej TEMPLATES
:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.recent_blog_posts',
],
},
},
]
(W wersjach Django wcześniejszych niż 1.9, ustawiono to bezpośrednio w settings.py
przy użyciu zmiennej TEMPLATE_CONTEXT_PROCESSORS
.)
Krok 3: Użyj procesora kontekstu w swoich szablonach
Nie trzeba już przekazywać najnowszych wpisów na blogu przez poszczególne widoki! Po prostu użyj recent_blog_posts
na recent_blog_posts
w dowolnym szablonie.
Na przykład w home.html
możesz utworzyć pasek boczny z linkami do najnowszych postów:
<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>
Lub w blog.html
możesz stworzyć bardziej szczegółowy sposób wyświetlania każdego postu:
<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>
Rozszerzanie szablonów
Procesor kontekstowy w celu ustalenia szablonu na podstawie członkostwa w grupie (lub dowolnego zapytania / logiki). Pozwala to naszym publicznym / zwykłym użytkownikom uzyskać jeden szablon, a naszej grupie specjalnej uzyskać inny.
myapp /ext_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,
}
Dodaj procesor kontekstowy do swoich ustawień.
W szablonach użyj zmiennej zdefiniowanej w procesorze kontekstowym.
{% extends site_template %}