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())]
РЕДАКТИРОВАТЬ 2: В ответ на ваше второе редактирование причина, по которой он печатает "Нет", заключается в том, что вы не возвращаетесь из get_queryset
метод AlphabeticView
, Измените последнюю строку в этом методе на
return super(AlphabeticView, self).get_queryset()