1

我有一个带有餐厅模型的应用程序。我想了解将显示餐厅对象列表的视图放在一起的最佳方式是什么,但上面还有一个搜索表单,用户可以输入参数来过滤显示的结果。如果未输入任何参数,则应显示所有餐厅。我已经在使用 haystack 并有一个搜索表单,但目前它位于独立的 search.html 模板上。我在一个单独的模板上也有一个 ListView,我想我正在寻找一个结合了这些的最终结果。

我在网上做了一些阅读,目前还不清楚最好的方法是什么:

  1. 仅使用来自 Django 的 listview 和一些查询集过滤
  2. 将 haystack SearchView 与基于 django 类的视图相结合?
  3. 这是我迄今为止最好的选择——从 Haystack 创建自定义版本的 SearchView

理想情况下,最终搜索功能将包括允许自动完成用户输入,并在用户键入时动态过滤结果。

关于解决此问题的最佳方法的任何想法以及那里的任何示例?

4

1 回答 1

2

可能有一些包可以自动为您提供所有内容,显示查询集列表并允许简单添加搜索栏等(如管理站点)。但我认为你仍然是 Web 开发的初学者,所以我强烈建议你放弃列表视图,放弃 haystack,放弃一切,自己动手。

看,它们不是坏方法或任何东西,但它们就像捷径。只有当它们缩短原始方式时,快捷方式才是好的,在您的情况下,它并没有那么长。

举个例子,这里有一个显示项目列表的简单方法:

视图.py

def restaraunt_list(request):
    restaraunts = Restaraunt.objects.all().order_by('name')[:100] # Just for example purposes. You can order them how you'd like, and you probably want to add pagination instead of limiting the view number arbitrarily

    context = {'restaraunts': restaraunts}
    return render_to_response('index.html', context)

索引.html:

<ul>
{% for rest in restaraunts %}
    <li>{{ rest }}</li>
{% endfor %}
</ul>

而已。现在它显示在列表中。现在要添加搜索过滤器,您需要做的就是:

index.html(在任何你想要的地方添加它)

<form>
    <input type='text' name='q' id='q'></input>
    <input type='submit' value='search!'></input>
</form>

当用户从 'q' 发送数据时,它通过 GET 发送,然后在服务器端添加:

def restaraunt_list(request):
    restaraunts = Restaraunt.objects.all()

    # filter results!
    if request.method == 'GET':
        q = request.GET['q']
        if q != '':
            restaraunts = restaraunts.filter(name__contains=q)

    # ordering is the last thing you do
    restaraunts = restaraunts.order_by('name')[:100] 

    context = {'restaraunts': restaraunts}
    return render_to_response('index.html', context)

现在,这将起作用,但是根据您所写的内容,我了解您希望搜索在按下键的那一刻生效。为此,您需要使用 AJAX(去了解它是如何工作的,我不会在这里深入研究)。至于自动完成,您应该查看jQuery UI

但是,就像我说的,在继续使用所有这些东西之前,我建议你先学习基础知识。浏览django 教程(如果你还没有的话),并在每一步都使用非常详细的 django-docs。当某些特定的事情不起作用并且您遇到困难时,请来到 Stackoverflow,一定有人会帮助您。祝你好运!

于 2013-08-23T08:55:12.503 回答