Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
get_context_data
get_context_data — это метод в Django class-based views (CBV), который отвечает за формирование контекста (словаря переменных), передаваемого в HTML-шаблон. Это один из ключевых методов для передачи данных из представления в шаблон.
Назначение и использование
Метод get_context_data вызывается автоматически и должен возвращать словарь, который затем используется для рендеринга шаблона. Он применяется в шаблонизирующих представлениях (TemplateResponseMixin).
Базовый пример
from django.views.generic import ListView
from django.views.generic.base import TemplateView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/list.html'
context_object_name = 'articles'
def get_context_data(self, **kwargs):
# Получаем базовый контекст от родительского класса
context = super().get_context_data(**kwargs)
# Добавляем свои переменные
context['title'] = 'Все статьи'
context['total_count'] = Article.objects.count()
return context
В шаблоне:
<h1>{{ title }}</h1>
<p>Всего статей: {{ total_count }}</p>
{% for article in articles %}
<div>{{ article.title }}</div>
{% endfor %}
Передача дополнительного контекста
from django.views.generic import DetailView
class ArticleDetailView(DetailView):
model = Article
template_name = 'articles/detail.html'
context_object_name = 'article'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Получаем текущую статью
article = context['article']
# Добавляем связанные данные
context['related_articles'] = Article.objects.filter(
category=article.category
).exclude(id=article.id)[:5]
context['comments'] = article.comments.all()
context['is_author'] = article.author == self.request.user
return context
Работа с параметрами запроса (GET parameters)
from django.views.generic import ListView
from django.core.paginator import Paginator
class ProductListView(ListView):
model = Product
template_name = 'products/list.html'
paginate_by = 20
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Получаем query параметры
search = self.request.GET.get('q', '')
sort_by = self.request.GET.get('sort', 'name')
# Передаём их обратно в шаблон для форм
context['search_query'] = search
context['current_sort'] = sort_by
return context
Фильтрация данных через get_context_data
class AuthorArticlesView(ListView):
template_name = 'articles/author.html'
context_object_name = 'articles'
paginate_by = 10
def get_queryset(self):
author_id = self.kwargs['author_id']
return Article.objects.filter(author_id=author_id)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
author_id = self.kwargs['author_id']
# Получаем информацию об авторе
context['author'] = Author.objects.get(id=author_id)
# Добавляем статистику
context['total_articles'] = context['articles'].count()
context['published_articles'] = context['articles'].filter(published=True).count()
return context
TemplateView пример
from django.views.generic.base import TemplateView
from django.utils import timezone
class DashboardView(TemplateView):
template_name = 'dashboard.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Для TemplateView нет автоматического контекста
# Нужно всё передавать вручную
context['user'] = self.request.user
context['current_date'] = timezone.now()
context['statistics'] = self.get_statistics()
return context
def get_statistics(self):
return {
'users': User.objects.count(),
'articles': Article.objects.count(),
'comments': Comment.objects.count(),
}
Важные моменты
Всегда вызывайте super():
# ПРАВИЛЬНО
context = super().get_context_data(**kwargs)
# НЕПРАВИЛЬНО — потеряются данные от родительского класса
context = {}
Возвращайте словарь:
# ПРАВИЛЬНО
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['my_var'] = 'value'
return context
# НЕПРАВИЛЬНО
def get_context_data(self, **kwargs):
super().get_context_data(**kwargs) # Ничего не возвращает
Когда использовать
- Добавление дополнительных переменных в контекст
- Передача пользовательских данных в шаблон
- Обработка параметров запроса
- Получение и передача связанных данных
- Настройка параметров шаблонизации
Преимущества class-based views с get_context_data
- Чистота — разделение логики для получения данных и их передачи
- Переиспользуемость — легко наследовать и расширять
- Структурированность — явное место для добавления контекста
- Удобство — не нужно вызывать render вручную