在Django上搜索Sphinx会在/ search /上引发异常TypeError

时间:2013-01-27 15:57:08

标签: django postgresql sphinx django-sphinx

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

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

因此,当我尝试在Django中搜索我的表单时,我会遇到异常:

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

我也尝试通过改变urlpattern& amp;来改变基于steyblind的评论。像这样的视图定义:

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

def search(request, query=''): 

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

这是我的片段:

Urls.py

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

Views.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))

search.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 %}

1 个答案:

答案 0 :(得分:1)

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

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

>> list()
[]

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

context = { 'flows': list() }

如果你看模板,这真的什么都没有。

urls.py:

(r'^search/', search),

views.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,您可以将以下内容实现为一个简单的搜索,它将返回空白搜索的所有结果,即查询的实际过滤结果。

views.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))