如何将get_queryset()中的值传递给get_context_data()

时间:2018-05-08 19:43:52

标签: django django-queryset

由于get_queryset()只返回一个查询集,我需要查询集search_store到模板文件的长度。因此,我尝试通过get_context_data将值发送到模板。

我知道我可以通过{{ queryset|length }}得到一个查询集的长度,但由于某种原因,它只返回由分页分隔的查询集的长度,所以我只得到一个部分长度。

当您看到代码时,我正在尝试打印search_stores.count(),我需要从get_context_data get_queryset获取该代码。谁能让我知道我怎么能这样做?

class SearchListView(ListView):
    model = Store
    template_name = 'boutique/search.html'
    paginate_by = 2
    context_object_name = 'search_stores'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['search_text'] = self.request.GET.get('search_text')
        context['sorter'] = self.request.GET.get('sorter')
        if not context['sorter']:
            context['sorter'] = 'popularity'
        return context

    def get_queryset(self):

        search_text = self.request.GET.get('search_text')
        sorter = self.request.GET.get('sorter')

        if not sorter:
            sorter = 'popularity'

        if search_text:
            search_stores = Store.objects.filter(Q(businessName__icontains=search_text) | Q(mKey__icontains=search_text))
            if sorter == 'businessName':
                search_stores = search_stores.order_by(sorter)
            else:
                search_stores = search_stores.order_by(sorter).reverse()
        else:
            search_stores = ''

        for store in search_stores:
            store.mKey = store.mKey.split(' ')

        print(search_stores.count())
        return search_stores

3 个答案:

答案 0 :(得分:2)

当列表视图被分页时,您可以使用paginator访问模板上下文中的分页器。

因此,您可以使用以下命令访问整个(unpaginated)查询集的长度:

{{ paginator.count }}

另外,您的get_queryset方法应始终返回列表或查询集。如果未指定search_text,则可以返回空的查询集Store.objects.none()

def get_queryset(self):
    ...

    if search_text:
        ...
    else:
        search_stores = Store.objects.none()

    return search_stores

我还会避免在查询集上循环以设置store.mKey = store.mKey.split(' ')。这将评估整个查询集,而不仅仅是您正在显示的页面。向模型添加属性可能更好,例如:

class Store(models.Model):
    ...

    @property
    def mkey_list(self):
        return self.mKey.split(' ')

然后在您的模板中,您可以执行以下操作:

{% for key in store.mkey_list %}
   {{ key }}
{% endfor %}

答案 1 :(得分:0)

您可以使用{{queryset.count}}代替{{queryset | length}}

答案 2 :(得分:0)

如果问题是“如何将值从get_queryset()传递到get_context_data()”, 然后get_queryset()返回object_list,您可以通过以下方式访问它:

    def get_context_data(self):
        .....
        something = self.object_list
        .....