Django Haystack - Show results without needing a search query?

后端 未结 5 2229
情书的邮戳
情书的邮戳 2021-02-08 10:46

I would like to display all results which match selected facets even though a search query has not been inserted. Similar to how some shop applications work e.g. Amazon

5条回答
  •  隐瞒了意图╮
    2021-02-08 11:16

    Why No Results?

    I imagine you're using a search template similar to the one in the haystack getting started documentation. This view doesn't display anything if there is no query:

    {% if query %}
        {# Display the results #}
    {% else %}
        {# Show some example queries to run, maybe query syntax, something else? #}
    {% endif %}
    

    The second problem is that the default search form's search() method doesn't actually search for anything unless there's a query.

    Getting Results

    To get around this, I'm using a custom search form. Here's an abbreviated sample:

    class CustomSearchForm(SearchForm):
        ...
        def search(self):
            # First, store the SearchQuerySet received from other processing.
            sqs = super(CustomSearchForm, self).search()
    
            if not self.is_valid():
              return sqs
    
            filts = []
    
            # Check to see if a start_date was chosen.
            if self.cleaned_data['start_date']:
                filts.append(SQ(created_date__gte=self.cleaned_data['start_date']))
    
            # Check to see if an end_date was chosen.
            if self.cleaned_data['end_date']:
                filts.append(SQ(created_date__lte=self.cleaned_data['end_date']))
    
            # Etc., for any other things you add
    
            # If we started without a query, we'd have no search
            # results (which is fine, normally). However, if we
            # had no query but we DID have other parameters, then
            # we'd like to filter starting from everything rather
            # than nothing (i.e., q='' and tags='bear' should 
            # return everything with a tag 'bear'.)
            if len(filts) > 0 and not self.cleaned_data['q']:
                sqs = SearchQuerySet().order_by('-created_date')
    
            # Apply the filters
            for filt in filts:
                sqs = sqs.filter(filt)
    
            return sqs
    

    Also, don't forget to change the view:

    {% if query or page.object_list %}
        {# Display the results #}
    {% else %}
        {# Show some example queries to run, maybe query syntax, something else? #}
    {% endif %}
    

    Actually, the view code is a little hackish. It doesn't distinguish query-less searches with no results from search with no parameters.

    Cheers!

提交回复
热议问题