如何将值从 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 视图