Django ListView - контекст не обновляется

views.py

class PaginatorView(_LanguageMixin, ListView):
    context_object_name = 'concepts'

    #some custom functions like _filter_by_first_letter   

    def get_queryset(self):
        # some logic here ...

        all_concepts = self._filter_by_letter(self.concepts, letters, startswith)
        #letters and startswith are obtained from the logic above

        print all_concepts
        return all_concepts

    def get_context_data(self, **kwargs):
        context = super(PaginatorView, self).get_context_data(**kwargs)
        print context[self.context_object_name]
        context.update({
            'letters': [(l[0], self._letter_exists(context[self.context_object_name], l)) for l in self.all_letters],
            'letter': self.letter_index,
            'get_params': self.request.GET.urlencode(),
        })

        return context

print all_concepts Заявление печатает все мои концепции правильно. Так что все, пока здесь работает просто отлично. Потом я вернусь all_concepts,

Не должен в этот момент, all_concepts будучи добавленным в контекст, под ключом, указанным context_object_name? т.е. context['concepts'] должны быть заполнены all_concepts?

Если это так, оператор печати внутри get_context_data ничего не печатает. Что наводит меня на мысль, что контекст не был обновлен.

Когда я ранее использовал DetailView, get_object функция обновляла контекст, на который ссылается context_object_name правильно. (т.е. контекст [context_object_name] был заполнен объектом, возвращаемым get_object) Не должен get_queryset сделать то же самое для ListView?

_LanguageMixin также определяется в views.py, но это не так актуально для моей проблемы. Просто включил его здесь, чтобы вы могли увидеть

class _LanguageMixin(object):

    def dispatch(self, request, *args, **kwargs):
        self.langcode = kwargs.pop("langcode")
        self.language = get_object_or_404(Language, pk=self.langcode)
        return super(_LanguageMixin, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(_LanguageMixin, self).get_context_data(**kwargs)
        context.update({"language": self.language,
                        "languages": Language.objects.values_list('code',
                                                                  flat=True)})
        return context

[EDIT1]

если вместо этого я сохраню all_concepts т.е. self.all_concepts=... а потом я использую self.all_concepts вместо context[self.contex_object_name]все работает нормально.

[EDIT2]

Я никогда не создаю экземпляр PaginatorView. Это только для расширенных целей. Здесь внизу вы можете увидеть, как я это расширяю. self.concepts помогает мне найти all_concepts в get_queryset родительского класса (PaginatorView)

class AlphabeticView(PaginatorView):
    template_name = "alphabetic_listings.html"
    model = Property

    def get_queryset(self):
        self.concepts = (
            self.model.objects.filter(
                name='prefLabel',
                language__code=self.langcode,
            )
            .extra(select={'name': 'value',
                           'id': 'concept_id'},
                   order_by=['name'])
            .values('id', 'name')
        )
        super(AlphabeticView, self).get_queryset()

1 ответ

Решение

Распечатка заявления в get_context_data печатает пустой, потому что переменная context_object_name пустой. Тебе стоит попробовать print context[self.context_object_name]

РЕДАКТИРОВАТЬ: в ответ на вашу коррекцию, попробуйте

print context[self.get_context_object_name(self.get_queryset())]

get_context_object_name docs

РЕДАКТИРОВАТЬ 2: В ответ на ваше второе редактирование причина, по которой он печатает "Нет", заключается в том, что вы не возвращаетесь из get_queryset метод AlphabeticView, Измените последнюю строку в этом методе на

return super(AlphabeticView, self).get_queryset()
Другие вопросы по тегам