Django 如果为空,则重做queryset并将信息传递给模板

Django 如果为空,则重做queryset并将信息传递给模板,django,django-queryset,Django,Django Queryset,在视图a中,我将queryset修改为按名称筛选: def get_queryset(self, *args, **kwargs): qs = super().get_queryset() if self.request.GET.get('q'): qs = qs.search_by_keyword(self.request.GET.get('q')) return qs 如果q查询集过滤后没有结果,我想执行默认的查询集,但也要传递给我这样做的模板 我知道如何在上

在视图a中,我将queryset修改为按名称筛选:

def get_queryset(self, *args, **kwargs):
 qs = super().get_queryset()
 if self.request.GET.get('q'):
            qs = qs.search_by_keyword(self.request.GET.get('q'))
 return qs
如果q查询集过滤后没有结果,我想执行默认的查询集,但也要传递给我这样做的模板

我知道如何在上下文中检查是否有一个由“q”过滤的查询,但这不能说明“q”过滤查询是空的还是搜索参数没有结果,因此我调用默认查询

因此,有两个步骤:

- detect that a queryset was empty and call the default queryset
- pass to the template a variable to tell that the initial queryset was empty and I call the default query
例如,如果有人搜索q='keyword',返回的queryset为空,我希望使用所有项执行默认queryset


我需要在模板中知道,因为我想告诉用户,我们没有找到您正在搜索的内容,因此我们将向您显示所有结果。

您可以在get\u queryset中设置实例属性,并在get\u context\u data方法中检查它:


如果q filtering的查询为空,我希望执行默认查询;在您的示例中,您只需检查是默认查询还是带有q筛选的查询,而不是q筛选没有结果,并且在初始查询之后调用了正常查询query@user3541631啊,我理解错了你的问题。检查更新的答案。第二个解决方案做同样的事情;如果q存在且为“word”,则即使q为空或不为空,查询_修改后的返回值也始终为真;如果q过滤的qs为空,则执行默认qs;我用一个例子更新了我的问题check@user3541631再试一次:qs.exist不是再次执行查询集吗?我可以说如果qs,但我认为这是在返回之前执行查询,我不知道后端发生了什么
def get_queryset(self, *args, **kwargs):
    qs = super().get_queryset()
    self.query_modified = False
    if self.request.GET.get('q'):
            qs = qs.search_by_keyword(self.request.GET.get('q'))
            if qs.exists():  
                self.query_modified = True
            else:
                qs = super().get_queryset()  
    return qs

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['query_modified'] = self.query_modified
    return context