我有一个带有餐厅模型的应用程序。我想了解将显示餐馆对象列表的视图组合在一起的最佳方法是什么,但上面还有一个搜索表单,用户可以输入参数来过滤显示的结果。如果未输入参数,则应显示所有餐馆。我已经在使用haystack并有一个搜索表单,但目前它是在一个独立的search.html模板上。我在一个单独的模板上也有一个ListView,我想我正在寻找一个结合这些的最终结果。
我做了一些在线阅读,目前还不清楚最好的方法是:
关于最佳方式是什么以及那里的任何例子的任何想法?
答案 0 :(得分:2)
可能有一些软件包会自动为您提供所有内容,显示查询集列表并允许简单添加搜索栏等(如管理站点)。但我认为你仍然是网络开发的初学者,所以我强烈建议你删除列表视图,删除haystack,删除所有内容,然后自己完成。
看,他们不是坏方法或任何东西,但他们就像快捷方式。而快捷方式只有在缩短原始方式时才有用,在你的情况下,这种方式并不长。
举个例子,这是一个显示项目列表的简单方法:
views.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)
的index.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 tutorial(如果你还没有),并在每一步使用惊人详细的django-docs。如果某些特定的东西不起作用并且您遇到困难,请来到Stackoverflow,有人肯定会帮助您。祝你好运!