在Django应用程序中添加一个简单的搜索
所以我遵循this教程来搜索我的一些模型。但是,对于提供的内容以及作为Django新手的文档缺乏文档,我很困惑为了完成这项工作而缺少什么。在Django应用程序中添加一个简单的搜索
因此,这里是我有:
编辑
修订中,搜索模板,包括输入字段读取查询。
myproject.templates.search.html:
<form action="" method="get">
<label for="id_q">Search:</label>
<input id="id_q" name="q" type="text">
<input type="submit" value="Submit">
{% if found_entries %}
<p>You searched for "{{ query_string }}".</p>
<ul>
{% for i in found_entries %}
{{ i.uid }} {{ i.title }} {{ value|linebreaks }}
{% endfor %}
</ul>
{% endif %}
{% if query_string and not found_entries %}
<p>No results found.</p>
{% else %}
<p>Type a search query into the box above, and press "Submit" to search.</p>
{% endif %}
</form>
myapp.models.py:
from django.db import models
class Book(models.Model):
uid = models.IntegerField(primary_key=True)
title = models.CharField(max_length=30)
class Meta:
db_table = u'books'
myapp.search.py:
import re
from django.db.models import Q
def normalize_query(query_string,
findterms=re.compile(r'"([^"]+)"|(\S+)').findall,
normspace=re.compile(r'\s{2,}').sub):
''' Splits the query string in invidual keywords, getting rid of unecessary spaces
and grouping quoted words together.
Example:
>>> normalize_query(' some random words "with quotes " and spaces')
['some', 'random', 'words', 'with quotes', 'and', 'spaces']
'''
return [normspace(' ', (t[0] or t[1]).strip()) for t in findterms(query_string)]
def get_query(query_string, search_fields):
''' Returns a query, that is a combination of Q objects. That combination
aims to search keywords within a model by testing the given search fields.
'''
query = None # Query to search for every search term
terms = normalize_query(query_string)
for term in terms:
or_query = None # Query to search for a given term in each field
for field_name in search_fields:
q = Q(**{"%s__icontains" % field_name: term})
if or_query is None:
or_query = q
else:
or_query = or_query | q
if query is None:
query = or_query
else:
query = query & or_query
return query
myapp.views.py :
from myapp.models import Book
from django.shortcuts import render_to_response
from django.template import RequestContext
def search(request):
query_string = ''
found_entries = None
search_fields=('uid')
if ('q' in request.GET) and request.GET['q'].strip():
query_string = request.GET['q']
entry_query = get_query(query_string, search_fields)
found_entries = Book.objects.filter(entry_query)
return render_to_response('search.html',
{ 'query_string': query_string, 'found_entries': found_entries },
context_instance=RequestContext(request))
myproject.templates.search.html:
{% if found_entries %}
<p>You searched for "{{ query_string }}".</p>
<ul>
{% for i in found_entries %}
<li><a href="{{ q.get_absolute_url }}">{{ found_entries }}</a></li>
{% endfor %}
</ul>
{% endif %}
{% if query_string and not found_entries %}
<p>No results found.</p>
{% else %}
<p>Type a search query into the box above, and press "Submit" to search.</p>
{% endif %}
myproject.urls.py
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^predictor/$', 'myapp.views.search'),
)
而这里的是什么样子,如果我去:http://localhost:8000/myapp/
图像:http://i.imgur.com/QFaWZ.png
谢谢!
您的模板中没有任何表单:您从未在网页上放置搜索框,为什么要显示?请参考django documentation on using forms。
这需要相当数量的工作,但是您并没有使用Django的任何内置机器来创建窗体。这样做会使你的代码更清晰(并且会更容易!)。
如果你看看你的代码(我鼓励你这样做),你正在看的视图是myapp.views.search的权利?看看你的搜索函数,你应该能够看到它看起来像request.GET中的'q'键,它等价于从查询字符串中获取'q'元素,所以这就是从中获取搜索的位置。
因此,要搜索,你会去http://localhost:8000/myapp/?q=searchterm
其中'searchterm'是指你所搜索的术语。
就像托马斯说的,尽管你可能也想创建一个表单来使用这个功能。
是的,看起来更好,你也可以写一个Django表单来做同样的事情,如果你发现自己重用这个表单,但是你在做的事情看起来很好。 – hkothari
你确切的问题是什么? –
当你做一些像http:// localhost:8000/myapp /?q = word时会发生什么? – JoseP