Python Django/Haystack/Elasticsearch在未提供查询时显示所有结果
这是我在这里的第一篇帖子,所以如果我做了什么,我不应该说,我会改变它。 我目前正在与django一起开发一个项目。我被卡住了好几次,但在stackoverflow这里我可以帮助自己回答一些很好的问题和答案。 我现在已经到了一个无法独自解决的地步,所以问题是: 我正在用haystack和elasticsearch实现搜索。所有的索引工作,我得到我想要的结果。排序和过滤也起作用。现在,我希望能够在默认情况下显示所有结果,然后在没有查询的情况下对它们进行过滤或排序。我什么都试过了 不过,对我来说,将Searchform子类化似乎并不管用 我的代码: forms.py:Python Django/Haystack/Elasticsearch在未提供查询时显示所有结果,python,django,search,elasticsearch,Python,Django,Search,elasticsearch,这是我在这里的第一篇帖子,所以如果我做了什么,我不应该说,我会改变它。 我目前正在与django一起开发一个项目。我被卡住了好几次,但在stackoverflow这里我可以帮助自己回答一些很好的问题和答案。 我现在已经到了一个无法独自解决的地步,所以问题是: 我正在用haystack和elasticsearch实现搜索。所有的索引工作,我得到我想要的结果。排序和过滤也起作用。现在,我希望能够在默认情况下显示所有结果,然后在没有查询的情况下对它们进行过滤或排序。我什么都试过了 不过,对我来说,将S
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 %}&page={{ page_obj.previous_page_number }}">{% endif %}«
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 %}&page={{ page_obj.next_page_number }}">{% endif %}
Weiter »{% if page_obj.has_next %}</a>{% endif %}
</div>
{% endif %}
{% else %}
{# Show some example queries to run, maybe query syntax, something else? #}
{% endif %}
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
url(r'^search/$', views.MySearchView.as_view(form_class=CustomSearchForm), name='search_view'),
我缩短了html代码的可视性,希望所有相关的东西都在那里
在不同的URL上会发生什么:
所有结果-127.0.0.1:8000/取消/搜索/
无结果-127.0.0.1:8000/de/search/?&order\u up\u Bildungsart
无结果-127.0.0.1:8000/de/search/?&filterbildungsart=学士
无结果-127.0.0.1:8000/de/search/?q=
所有结果-127.0.0.1:8000/de/search/?q=德国
(q=Deutschland是一个所有索引项现在都有共同点的查询)
所有结果-127.0.0.1:8000/de/search/?q=Deutschland&filterfachbereich=IngenieurwisSensChapten&order\u up\u Bildungsart
(所有结果按预期进行排序和筛选)
我的问题还在于,我似乎无法从表单中进入代码。打印语句不会出现在终端中
在前面提到的问题中,我也尝试过其他方法,但都没有用
提前谢谢你的帮助。把我的问题放到一边,然后又开始解决另一个问题,我终于发现了我的错误。我的自定义视图没有使用自定义表单,因为我没有将其添加到url.py中。通过URL.py将form_class属性赋予我的视图,所有内容都将在不进行查询的情况下显示: url.py:
<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 %}&page={{ page_obj.previous_page_number }}">{% endif %}«
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 %}&page={{ page_obj.next_page_number }}">{% endif %}
Weiter »{% if page_obj.has_next %}</a>{% endif %}
</div>
{% endif %}
{% else %}
{# Show some example queries to run, maybe query syntax, something else? #}
{% endif %}
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
url(r'^search/$', views.MySearchView.as_view(form_class=CustomSearchForm), name='search_view'),
不要使用all()函数,而是使用load\u all()函数。 正如我所观察到的,当数量较高时,all()会花费更多的时间返回结果,而load_all()会很快给出结果,如函数描述中所述:“有效地填充搜索结果中的对象。”