Этот вопрос проверяет понимание механизма передачи данных из представления Django в шаблон через контекст, что является фундаментальным для динамической генерации веб-страниц.
Контекст в Django — это мост между бизнес-логикой, написанной на Python в представлениях (views), и HTML-шаблонами, которые отвечают за отображение. Без контекста шаблоны были бы статичными. Механизм контекста позволяет инкапсулировать данные, подготовленные представлением, и безопасно передавать их в слой отображения.
Контекст формируется как обычный словарь Python (dict) внутри функции или метода представления. Ключи словаря становятся переменными, доступными в шаблоне.
from django.shortcuts import render
from .models import Article
def article_list(request):
# 1. Получаем данные (например, из базы данных)
articles = Article.objects.filter(published=True)
latest_article = articles.last()
# 2. Формируем словарь контекста
context = {
'articles': articles, # Ключ 'articles' -> QuerySet статей
'latest': latest_article, # Ключ 'latest' -> объект статьи
'page_title': 'Наш блог', # Ключ 'page_title' -> простая строка
'user': request.user, # Ключ 'user' -> объект пользователя
}
# 3. Передаём контекст в шаблон через render()
return render(request, 'blog/list.html', context)В шаблоне blog/list.html вы получаете доступ к данным по ключам, указанным в контексте:
<!-- blog/list.html -->
<h1>{{ page_title }}</h1>
<p>Привет, {{ user.username }}!</p>
<h2>Последняя статья: {{ latest.title }}</h2>
<ul>
{% for article in articles %}
<li>{{ article.title }} ({{ article.publish_date }})</li>
{% endfor %}
</ul>В классах представлений (Class-Based Views, CBV) контекст часто формируется автоматически или дополняется через методы:
get_context_data() — основной метод для добавления данных в контекст в CBV.from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'blog/list.html'
context_object_name = 'articles' # Меняем имя переменной по умолчанию
def get_context_data(self, **kwargs):
# 1. Получаем контекст от родительского класса
context = super().get_context_data(**kwargs)
# 2. Добавляем свои данные
context['page_title'] = 'Статьи, сформированные через CBV'
context['extra_info'] = 'Данные добавлены в get_context_data'
return contextКонтекст применяется для передачи любых данных: результатов запросов ORM, форм, пагинации, статистики, флагов состояния. Важно:
Вывод: Контекст — это простой, но мощный механизм Django для отделения логики от представления. Его стоит применять всегда, когда нужно отобразить динамические данные. Использование контекста делает код чище, а шаблоны — более предсказуемыми и безопасными, так как шаблонизатор Django по умолчанию экранирует HTML в переменных контекста.