1.接下来,我们利用现有的Book数据做一个简单的查询页面。这既然是基于Book app的,我们就把搜索视图放在books.views中:
books/views codes:
2.同时,我们也要有相匹配的查询页面模板,他放在templates/books/下
templates/books/search.html codes:
3.接下来就是在URLconf中添加视图索引
urls codes:
4.Django拥有创建自定义表单的模板,暂且不议
books/views codes:
from django.db.models import Q #导入查询对象
from django.shortcuts import render_to_response #返回response的快捷方法
from models import Book
def search(request):
query = request.GET.get('q','') #request对象的GET方法将查询字符串返回为键:值字典,用get()方法来取字典值可以在不存在键的时候返回一个默认值
if query:
qset = (
Q(title__icontains=query)|
Q(authors__first_name__icontains=query)|
Q(authors__last_name__icontains=query)
)
results = Book.objects.filter(qset).distinct() #可以让一个Q对象作为filter()方法的参数,Q对象以某种查询逻辑初始化,为查询提供了这种逻辑逻辑。distinct()去重
else:
results = []
render_to_response("books/search.html",{'results':results,'query':query})
2.同时,我们也要有相匹配的查询页面模板,他放在templates/books/下
templates/books/search.html codes:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>Search{% if query %} Results{% endif %}</title>
</head>
<body>
<h1>Search</h1>
<form action="." method="GET">
<label for="q">Search: </label>
<input type="text" name="q" value="{{ query|escape }}">
<input type="submit" value="Search">
</form>
{% if query %}
<h2>Results for "{{ query|escape }}":</h2>#在所有使用 query 和 book 的地方,我们通过 escape 过滤器来确保任何可能的恶意的搜索文字被过滤出去,以保证不被插入到页面里。
{% if results %}
<ul>
{% for book in results %}
<li>{{ book|escape }}</l1>
{% endfor %}
</ul>
{% else %}
<p>No books found</p>
{% endif %}
{% endif %}
</body>
</html>
3.接下来就是在URLconf中添加视图索引
urls codes:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^search.html$','books.views.search'),
# Examples:
# url(r'^$', 'mysite.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
]
4.Django拥有创建自定义表单的模板,暂且不议