【发布时间】: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 %}&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 %}
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