如何将值从 get_queryset() 传递到 get_context_data()

Posted

技术标签:

【中文标题】如何将值从 get_queryset() 传递到 get_context_data()【英文标题】:How to pass value from get_queryset() to get_context_data() 【发布时间】:2018-10-18 20:29:29 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

这不归结为一样吗?它总是会显示当前页面的对象数......而@Jay实际上想要总数 是的,正确我需要总数,但长度仅根据每个分页返回部分数字。另外,我不知道为什么,但是 count 什么也不返回 count 非常适合我,刚刚尝试过! ...... count 使用带有 count(*) 的 SQL 请求 是的,通常 count 也对我有用,但我不知道为什么它在这里什么也不返回..【参考方案2】:

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

因此,您可以通过以下方式访问整个(未分页)查询集的长度:

 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 %

【讨论】:

太棒了!像魅力一样工作,也感谢您的额外建议!对我帮助很大【参考方案3】:

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

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

【讨论】:

谢谢。正是我需要的答案。 如果您使用分页,您可以通过在get_context_data() 中使用context['page_obj'] 访问当前页面 的对象列表。参考:docs.djangoproject.com/en/4.0/topics/pagination/…

以上是关于如何将值从 get_queryset() 传递到 get_context_data()的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从 javascript 函数传递到 django 视图

如何将值从片段/活动传递到 xml?

如何将值从基本适配器传递到 Android 中的 Activity

如何将值从一个活动传递到上一个活动

如何将值从动态列表视图传递到活动?

如何将值从一个片段的回收器视图项传递到另一个片段