【问题标题】:Django/Haystack/Elasticsearch show all results when no query is provided没有提供查询时,Django/Haystack/Elasticsearch 显示所有结果
【发布时间】:2017-08-15 16:40:43
【问题描述】:

这是我在这里的第一篇文章,所以如果我做了什么我不应该说的,我会改变它。 我目前正在用 django 开发一个项目。我被卡住了好几次,但能够在stackoverflow上帮助自己解决好问题和答案。 我现在处于无法独自解决这个问题的地步,所以这里有一个问题:

我正在使用 haystack 和 elasticsearch 实现搜索。所有索引都有效,我得到了我想要的结果。排序和过滤也有效。现在我希望能够默认显示所有结果,然后在没有查询的情况下过滤或排序它们。我已经在Django Haystack - Show results without needing a search query?尝试了所有方法

虽然子类化 Searchform 似乎对我不起作用。

我的代码:

forms.py

class CustomSearchForm(SearchForm):

    def no_query_found(self):
        print('no query')
        return self.searchqueryset.all()

search.html:

 <form method="get" action=".">
    {{ form.as_table }}
    <button>hit</button>
    </form>
...
        {% if query or page_obj %}
            {% for result in page_obj.object_list %}
                    <div class="col-md-2">
                        <div class="cell">
                            <div class="description">
                                {{ result.object.Studiengang }}
                            </div>
                        </div>
                    </div>
                    <div class="col-md-2">
                        <div class="cell">
                            <div class="description">
                                <p>{{ result.object.Bildungsinstitut }}</p>
...
                {% empty %}
                    <p>No results found.</p>
                {% endfor %}

            {% if page_obj.has_previous or page_obj.has_next %}
                <div>
                    {% if page_obj.has_previous %}
                        <a href="?
                                {% if urlquery %}{% for key, value in urlquery.items %}&{{ key }}={{ value }}{% endfor %}{% endif %}&amp;page={{ page_obj.previous_page_number }}">{% endif %}&laquo;
                    Zurück{% if page_obj.has_previous %}</a>{% endif %}
                    |
                    {% if page_obj.has_next %}
                        <a href="?
                                {% if urlquery %}{% for key, value in urlquery.items %}&{{ key }}={{ value }}{% endfor %}{% endif %}&amp;page={{ page_obj.next_page_number }}">{% endif %}
                    Weiter &raquo;{% if page_obj.has_next %}</a>{% endif %}
                </div>
            {% endif %}
        {% else %}
            {# Show some example queries to run, maybe query syntax, something else? #}
        {% endif %}

views.py:

class MySearchView(SearchView):
    """My custom search view."""

def get_queryset(self):
    urlquery = self.request.GET.copy()
    queryset = super(MySearchView, self).get_queryset()
    if urlquery:
        if 'filterbildungsart' in urlquery:
            queryset = queryset.filter(Bildungsart=urlquery['filterbildungsart'])
        if 'filterfachbereich' in urlquery:
            queryset = queryset.filter(Fachbereich=urlquery['filterfachbereich'])
        if 'order_up_Studiengang' in urlquery:
            return queryset.order_by('Studiengang')
        elif 'order_down_Studiengang'in urlquery:
            return queryset.order_by('-Studiengang')
        elif 'order_up_Bildungsinstitut' in urlquery:
            return queryset.order_by('Bildungsinstitut')
        elif 'order_down_Bildungsinstitut'in urlquery:
            return queryset.order_by('-Bildungsinstitut')
        else:
            return queryset
    else:
        return queryset

我已经缩短了 html 代码以提高可见性,并希望所有相关的内容都在那里。

不同的网址会发生什么:

所有结果 - 127.0.0.1:8000/de/search/

没有结果 - 127.0.0.1:8000/de/search/?&order_up_Bildungsart

没有结果 - 127.0.0.1:8000/de/search/?&filterbildungsart=Bachelor

没有结果 - 127.0.0.1:8000/de/search/?q=

所有结果 - 127.0.0.1:8000/de/search/?q=Deutschland (q=Deutschland 是一个查询,所有索引项现在都有共同点)

所有结果 - 127.0.0.1:8000/de/search/?q=Deutschland&filterfachbereich=Ingenieurwissenschaften&order_up_Bildungsart (所有结果都按预期排序和过滤)

我的问题还在于我似乎无法从我的表单中进入代码。 Print 语句不会出现在终端中。

我也尝试了上述问题中的其他方法,但无济于事。

在此先感谢您的帮助。

【问题讨论】:

    标签: python django search elasticsearch


    【解决方案1】:

    在将我的问题放在一边并转到另一个问题之后,我终于发现了我的错误。我的自定义视图没有使用我的自定义表单,因为我没有在 urls.py 中添加它。通过 urls.py 将 form_class 属性赋予我的视图,所有内容都无需查询即可显示:

    urls.py:

    url(r'^search/$', views.MySearchView.as_view(form_class=CustomSearchForm), name='search_view'),
    

    【讨论】:

      【解决方案2】:

      不要使用 all() 函数,而是使用 load_all() 函数。 正如我所观察到的,当数量很高时,all() 需要更多时间来返回结果,并且 load_all() 会非常快地给出结果,如函数描述中所述:"""有效地填充搜索结果中的对象。 """.

          def no_query_found(self):
              return self.searchqueryset.load_all()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-26
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多