如何在新页面中显示haystack(whoosh)结果?

0 投票
1 回答
688 浏览
提问于 2025-04-17 20:26

我有一个叫 index.html 的文件,里面放了我的表单:

...
{% block searchform%} {% endblock %}
...

在我的 search/ 文件夹里,有两个文件。

一个是 search.html,这是 index.html 的实际表单。

{% extends 'index.html' %}

{% block searchform %}
    <form method="get" action="/results/">
        <table>
            {{ form.as_table }}
            <tr>
                <td>&nbsp;</td>
                <td>
                    <input type="submit" value="Search">
                </td>
            </tr>
        </table>
{% endblock %}

另一个是 result.html,我想在这里看到我的搜索结果:

{% if query %}
<h3>Results</h3>
...
{% endif %}

urls.py:

from django.conf.urls import include, patterns, url
from dev_devices.views import *

urlpatterns = patterns('',
    url(r'^$', include('haystack.urls')),
    url(r'^results/$', results, name = 'results')
)
view.py

def results(request):
    return render_to_response('results.html')

我的问题是,结果没有显示出来。当我点击表单的提交按钮时,虽然会跳转到正确的文件(results.html),但没有任何结果显示。我知道这个问题已经有人问过,但我找不到答案,所以有人能帮我吗?谢谢!

1 个回答

0

好吧,你没有把任何结果传递给模板。看看你的 views.py 文件:

def results(request):
    return render_to_response('results.html')

你的模板里有这样的逻辑:

{% if query %}
<h3>Results</h3>
...
{% endif %}

query 这个变量在上下文中并不存在。你需要从视图中把这个查询传递过来:

def results(request):
    return render_to_response('results.html', {'query': 'some query'})

但更重要的是,你需要从 Haystack 获取实际的结果,并把这些结果也放到上下文中。我觉得你对这里发生的事情有些困惑。如果你想使用 Haystack 的默认搜索/结果视图,那么你就不应该定义任何自定义视图。按照你定义的结果视图,Django 怎么知道这个页面和 Haystack 有什么关系呢?

如果你 确实 想定义自定义视图,那么这些视图需要实现 Haystack 的搜索表单、创建搜索查询集、分页(等等),并把这些数据传递给模板。可以查看 Haystack 的文档,了解如何创建你自己的视图:

http://django-haystack.readthedocs.org/en/latest/views_and_forms.html#creating-your-own-view

如果你只是想查看你的结果,而这个特定的 URL 结构对你来说并不重要,那么只需把你的表单动作改为指向同一页面 action="",并把结果显示的逻辑从 results.html 移到 search.html。这样应该能让你看到 Haystack 默认视图和表单提供的基本搜索结果。

撰写回答