0

我正在尝试根据本教程使用 sphinx 搜索、postgresql 和 django 来构建全文搜索:http: //pkarl.com/articles/guide-django-full-text-search-sphinx-and-django-sp /。为 sphinx 和 postgresql 完成了所有设置,它可以工作,但是在到达示例 Django 代码部分时遇到了麻烦。

在 django views & urlconf 中,我只用自己的模型将 *search_results* 的功能更改为searchStory模型。对于 URLConf,我只将 *search_results* 更改为搜索,就像在视图上一样,搜索模板上没有任何更改。

因此,当我尝试从 Django 中的表单中搜索时,出现异常:

TypeError at /search/
list() takes exactly 1 argument (0 given)

我还尝试通过更改 urlpattern 和视图定义来根据 steyblind 的评论进行更改,如下所示:

(r'^search/(.*)?', search),

def search(request, query=''): 

但仍然保持获取 TypeError 异常。我在这里做错了吗?提前致谢。

这是我的片段:

网址.py

(r'^search/(.*)', search),

视图.py

def search(request, query):
    try:
        if(query == ''):
            query = request.GET['query']
        results = Flow.search.query(query)
        context = { 'flows': list(results),'query': query, 'search_meta':results._sphinx }
    except:
        context = { 'flows': list() }

    return render_to_response('search.html', context, context_instance=RequestContext(request))

搜索.html

{% extends "base.html" %}

{% block main %}

<div>
    <form action="/search/" method="GET">
        <input type="text" name="query"/>
        <input type="submit">
    </form>

    {% if flows %}
        <p>Your search for &ldquo;<strong>{{ query }}</strong>&rdquo; had <strong>{{ search_meta.total_found }}</strong> results.</p>
        <p>search_meta object dump: {{ search_meta }}</p>
    {% endif %}
    <hr/>
    {% for s in flows %}
            <h3><a href="{{ s.get_absolute_url }}">{{ s.title }}</a></h3>
            <p>(weight: {{ s.sphinx.weight }})</p>
            <p>story.sphinx object dump: {{ s.sphinx }}</p>
    {% empty %}
        <p>YOU HAVEN'T SEARCHED YET.</p>
    {% endfor %}
</div>

{% endblock %}
4

1 回答 1

1

如果我错了,请纠正我,但 Django-Sphinx 似乎是一个废弃的项目。它的最后一次更新是一年前,大多数更新是 3-5 年前。另外,我当时不能代表 Django,但它现在可以做,开箱即用,你试图用 Sphinx 做的事情。

您使用的是哪个版本的 Django 和 Python?你得到的错误很奇怪,因为list()不能接受任何参数。在 python shell 中试试这个:

>> list()
[]

无论如何,我对代码进行了一些修改,可能有助于解决问题。但是,如果没有results,您将'flows'在此行中传递为空:

context = { 'flows': list() }

如果你看一下模板,这真的什么都做不了。

网址.py:

(r'^search/', search),

视图.py:

def search(request):
        query = request.GET.get('query')
        if query:
            results = Flow.search.query(query)
        if results:
            context = { 'flows': list(results),'query': query, 'search_meta':results._sphinx }
        else:
            context = { 'flows': list() }
    return render_to_response('search.html', context, context_instance=RequestContext(request))

综上所述,我强烈建议,因为这个项目已经过时了,你可以使用自己的搜索。或者,如果您需要更多功能,您可以使用Haystack经常更新的搜索应用程序。使用与urls.py上面相同的方法,您可以将以下内容实现为一个简单的搜索,它将返回空白搜索的所有结果,即查询的实际过滤结果。

视图.py:

def search(request):
    query = request.GET.get('q')
    results = Flow.objects.all()
    if query:
        results = results.query(query)
    return render_to_response('search.html', {"flows": results,}, context_instance=RequestContext(request))
于 2013-01-27T16:41:45.313 回答