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 contextprint all_concepts语句正确地打印了我的所有概念。所以这里之前的一切都很正常。然后,我返回all_concepts。
此时不应该在all_concepts指定的键下将context_object_name添加到上下文中吗?也就是说,应该用context['concepts']填充all_concepts
如果是这样的话,get_context_data中的print语句将不会输出任何内容。这表明上下文没有被更新。
当我以前使用DetailView时,get_object函数正在正确地更新context_object_name引用的上下文。(即,contextcontext_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 contextEDIT1
如果我确实保存了all_concepts,即self.all_concepts=...,然后使用self.all_concepts而不是context[self.contex_object_name],那么一切都很好。
EDIT2
我从不实例化PaginatorView。只是为了扩大目的。在这里,你可以看到我是如何扩展它的。self.concepts帮助我在父类的get_queryset (PaginatorView)中找到all_concepts
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()发布于 2014-05-21 10:49:49
get_context_data中的print语句是空的,因为变量context_object_name是空的。你应该试试print context[self.context_object_name]
编辑:为了回应您的更正,请尝试
print context[self.get_context_object_name(self.get_queryset())]编辑2:响应您的第二次编辑,它打印“None”的原因是您没有从get_queryset方法AlphabeticView返回。将该方法的最后一行更改为
return super(AlphabeticView, self).get_queryset()https://stackoverflow.com/questions/23780159
复制相似问题