← Назад к вопросам

Что такое get_context_data?

1.3 Junior🔥 71 комментариев
#Другое

Комментарии (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 вручную
Что такое get_context_data? | PrepBro