Есть 2 одинаковых набора запросов в контексте для ListView
Мне интересно, почему в контексте есть 2 одинаковых набора запросов: object_list и massage_list. Может я что-то не так делаю? Я смог найти massage_list только в урлах path('work/', MassageListView.as_view(), name='massage_list')
class MassageListView(ListView):
def get_queryset(self):
return Massage.objects.filter(time_of_receipt__year=now().year,
time_of_receipt__month=now().month)
def get_context_data(self, *, object_list=None, **kwargs):
context = super(MassageListView, self).get_context_data(**kwargs)
month_salary = 0
for i in context['object_list']:
month_salary += i.price
context['month_salary'] = month_salary
context['form'] = MassageForm()
print(context)
return context
печатный контекст
{'paginator': None, 'page_obj': None, 'is_paginated': False, 'object_list': <QuerySet [<Massage: 2021-08-11 12:00:00+00:00>, <Massage: 2021-08-14 12:00:00+00:00>]>, 'massage_list': <QuerySet [<Massage: 2021-08-11 12:00:00+00:00>, <Massage: 2021-08-14 12:00:00+00:00>]>, 'view': <myapp.views.MassageListView object at 0x7f2e166200a0>, 'month_salary': 13800, 'form': <MassageForm bound=False, valid=Unknown, fields=(client;price;count;time_of_receipt)>}
Я нашел этот метод в MultipleObjectMixin
, который наследуется BaseListView
.
def get_context_object_name(self, object_list):
"""Get the name of the item to be used in the context."""
if self.context_object_name:
return self.context_object_name
elif hasattr(object_list, 'model'):
return '%s_list' % object_list.model._meta.model_name
else:
return None
Как видно, этот метод возвращает строку [model_name]_list
, которая в дальнейшем используется в методе get_context_data
наряду с object_list
.
def get_context_data(self, *, object_list=None, **kwargs):
"""Get the context for this view."""
queryset = object_list if object_list is not None else self.object_list
...
context_object_name = self.get_context_object_name(queryset)
...
if context_object_name is not None:
context[context_object_name] = queryset
...
return context
Но не волнуйтесь, это одни и те же объекты.
Однако странно, что это недокументированная возможность.