Django CBV: get_queryset () и get_context_data ()? - PullRequest
0 голосов
/ 02 августа 2020

В чем разница между get_queryset() и get_context_data() в ListView (и каковы их отношения).

И что передается как **kwargs в get_context_data(self, **kwargs), например, в path(' ', SomeViewList.as_view())?

Мой вопрос относится как к методам по умолчанию, так и, где это применимо, как к замещенным методам.

1 Ответ

0 голосов
/ 02 августа 2020

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>

, и это заставило меня поверить в то, что аргументы ключевых слов извлекаются из самого объекта представления.

...