Django
Контекстные процессоры
Поиск…
замечания
Используйте контекстные процессоры для добавления переменных, доступных в любом месте шаблонов.
Укажите функцию или функции, которые возвращают dict
s переменных, которые вы хотите, затем добавьте эти функции в TEMPLATE_CONTEXT_PROCESSORS
.
Используйте контекстный процессор для доступа к параметрам. DEBUG в шаблонах
в myapp/context_processors.py
:
from django.conf import settings
def debug(request):
return {'DEBUG': settings.DEBUG}
в settings.py
:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.debug',
],
},
},
]
или, для версий <1.9:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.debug',
)
Тогда в моих шаблонах просто:
{% if DEBUG %} .header { background:#f00; } {% endif %}
{{ DEBUG }}
Использование контекстного процессора для доступа к вашим последним блогам во всех шаблонах
Предполагая, что у вас есть модель под названием Post
определенная в файле models.py
который содержит сообщения в блоге, и имеет поле date_published
.
Шаг 1: Запишите обработчик контекста
Создайте (или добавьте) файл в каталог приложения, называемый 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
Шаг 2. Добавьте обработчик контекста в ваш файл настроек.
Убедитесь, что вы добавили новый процессор контекста в файл settings.py
в переменной TEMPLATES
:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.recent_blog_posts',
],
},
},
]
(В версиях Django до 1.9 это было задано непосредственно в settings.py
с помощью переменной TEMPLATE_CONTEXT_PROCESSORS
.)
Шаг 3. Использование контекстного процессора в ваших шаблонах
Не нужно передавать последние записи в блоге через отдельные просмотры больше! Просто используйте recent_blog_posts
в любом шаблоне.
Например, в home.html
вы можете создать боковую панель со ссылками на последние сообщения:
<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>
Или в blog.html
вы можете создать более подробное отображение каждого сообщения:
<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>
Расширение шаблонов
Контекстный процессор для определения шаблона на основе членства в группе (или любого запроса / логики). Это позволяет нашим публичным / обычным пользователям получать один шаблон и нашу специальную группу, чтобы получить другую.
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,
}
Добавьте контекстный процессор в свои настройки.
В ваших шаблонах используйте переменную, определенную в обработчике контекста.
{% extends site_template %}