get_queryset
Этот метод определяет список объектов, которые вы хотите отобразить. Он предоставит вам все модели, которые вы указали в своем представлении по умолчанию, но вы можете переопределить его и применить фильтры, сортировку и т. Д. c. Документация .
class FilteredAuthorView(ListView):
template_name = 'authors.html'
model = Author
def get_queryset(self):
# original qs
qs = super().get_queryset()
# filter by a variable captured from url, for example
return qs.filter(name__startswith=self.kwargs['name'])
get_context_data
Этот метод используется для заполнения словаря как контекста шаблона. Например, ListView
s будет заполнять результат из get_queryset()
(не вызывая фактическую функцию), но у вас также есть возможность отображать дополнительные данные в контексте.
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
data['page_title'] = 'Authors'
return data
Это два отдельных метода так что между ними нет прямой связи. Я буду считать get_context_data
более сложным, чем get_queryset
, поскольку вы можете добавлять пользовательские элементы в свой контекст.
Что касается аргументов ключевого слова (kwargs), Django нуждается в вызове базовой реализации (которая - получить модели по умолчанию) перед добавлением собственных вещей, даже если вам это не нужно. Kwargs будет включать модель, имя шаблона и т. Д. c. что приходит с вашим взглядом. Документация
Ссылка
РЕДАКТИРОВАТЬ
У меня есть мнение здесь, и я попытался распечатать из контекстных данных:
class JSONProfileView(JSONResponseMixin, DetailView):
model = User
template_name = 'accounts/dashboard/profile-json.html'
def get_context_data(self, **kwargs):
print(', '.join(['{}={!r}'.format(k, v) for k, v in kwargs.items()]))
data = serializers.serialize('json', self.get_queryset())
return data
Я получил это:
object=<User: userslug>
, и это заставило меня поверить в то, что аргументы ключевых слов извлекаются из самого объекта представления.