当没有提供查询时,Django / Haystack / Elasticsearch显示所有结果

时间:2017-03-23 08:30:32

标签: python django search elasticsearch

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

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

尝试了所有内容

虽然对搜索表进行了子类化,但似乎对我没有用。

我的代码:

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 /?&amp; order_up_Bildungsart

没有结果 - 127.0.0.1:8000/de/search /?&amp; 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语句不会出现在终端中。

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

先谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

把我的问题搁置一边然后再去另一个我终于找到了我的错误。我的自定义视图没有使用我的自定义表单,因为我没有在urls.py中添加它。通过urls.py将form_class属性提供给我的视图,所有内容都显示为没有查询:

<强> urls.py:

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

答案 1 :(得分:0)

使用 load_all()函数代替使用 all()函数。 正如我观察到的那样,当数量很高时,all()会花更多时间返回结果,并且load_all()可以非常迅速地返回结果,如函数描述中所述:“”“”有效地填充搜索结果中的对象。 “””

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