首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django ListView -上下文未被更新

Django ListView -上下文未被更新
EN

Stack Overflow用户
提问于 2014-05-21 10:11:33
回答 1查看 1.7K关注 0票数 1

views.py

代码语言:javascript
复制
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中的print语句将不会输出任何内容。这表明上下文没有被更新。

当我以前使用DetailView时,get_object函数正在正确地更新context_object_name引用的上下文。(即,contextcontext_object_name填充了get_object返回的对象) get_queryset不应该对ListView做同样的操作吗?

_LanguageMixin也是在views.py中定义的,但与我的问题不太相关。只是把它放在这里让你看看

代码语言:javascript
复制
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帮助我在父类的get_queryset (PaginatorView)中找到all_concepts

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-21 10:49:49

get_context_data中的print语句是空的,因为变量context_object_name是空的。你应该试试print context[self.context_object_name]

编辑:为了回应您的更正,请尝试

代码语言:javascript
复制
print context[self.get_context_object_name(self.get_queryset())]

名称文档

编辑2:响应您的第二次编辑,它打印“None”的原因是您没有从get_queryset方法AlphabeticView返回。将该方法的最后一行更改为

代码语言:javascript
复制
return super(AlphabeticView, self).get_queryset()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23780159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档