重做查询集if为空并将信息传递给模板

时间:2018-05-14 09:53:49

标签: django django-queryset

在View a中,我修改了查询集以按名称过滤:

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 Queryset没有过滤结果,我想执行默认查询集,但也传递给我这样做的模板。

我知道如果我的查询是通过' q'过滤的,context如何办理登机手续,但这并不能说明' 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'并且返回的查询集为空,并且我希望对所有项执行默认查询集,则为一个示例。

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

1 个答案:

答案 0 :(得分:1)

您可以在get_queryset中设置实例属性,并在get_context_data方法中进行检查:

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