第七章 表单处理.docx
- 文档编号:4946469
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:15
- 大小:25.48KB
第七章 表单处理.docx
《第七章 表单处理.docx》由会员分享,可在线阅读,更多相关《第七章 表单处理.docx(15页珍藏版)》请在冰豆网上搜索。
第七章表单处理
TheDjangoBook
About|Commenthelp|Contactus|Errata|BuytheprintversiononA
已完成93段共有93段完成度100%|中英文对照|英文|中文|上一章|目录|下一章|翻译|
第七章表单处理
本章作者是SimonWillison
经过上一章,你应该对简单网站有个全面的认识。
这一章,来处理web开发的下一个难题:
建立用户输入的视图。
我们会从手工打造一个简单的搜索页面开始,看看怎样处理浏览器提交而来的数据。
然后我们开始使用Django的forms框架。
搜索
在web应用上,有两个关于搜索获得巨大成功的故事:
Google和Yahoo,通过搜索,他们建立了几十亿美元的业务。
几乎每个网站都有很大的比例访问量来自这两个搜索引擎。
甚至,一个网站是否成功取决于其站内搜索的质量。
因此,在我们这个网站添加搜索功能看起来好一些。
开始,在URLconf(mysite.urls)添加搜索视图。
添加类似(r'^search/$','mysite.books.views.search')设置URL模式。
下一步,在视图模块(mysite.books.views)中写这个search视图:
fromdjango.db.modelsimportQ
fromdjango.shortcutsimportrender_to_response
frommodelsimportBook
defsearch(request):
query=request.GET.get('q','')
ifquery:
qset=(
Q(title__icontains=query)|
Q(authors__first_name__icontains=query)|
Q(authors__last_name__icontains=query)
)
results=Book.objects.filter(qset).distinct()
else:
results=[]
returnrender_to_response("books/search.html",{
"results":
results,
"query":
query
})
这里有一些需要注意的,首先request.GET,这从Django中怎样访问GET数据;POST数据通过类似的request.POST对象访问。
这些对象行为与标准Python字典很像,在附录H中列出来其另外的特性。
什么是GETandPOST数据?
GET和POST是浏览器使用的两个方法,用于发送数据到服务器端。
一般来说,会在html表单里面看到:
它指示浏览器向/books/search/以GET的方法提交数据
关于GET和POST这两个方法之间有很大的不同,不过我们暂时不深入它,如果你想了解更多,可以访问:
http:
//www.w3.org/2001/tag/doc/whenToUseGet.html。
所以下面这行:
query=request.GET.get('q','')
寻找名为q的GET参数,而且如果参数没有提交,返回一个空的字符串。
注意在request.GET中使用了get()方法,这可能让大家不好理解。
这里的get()是每个python的的字典数据类型都有的方法。
使用的时候要小心:
假设request.GET包含一个'q'的key是不安全的,所以我们使用get('q','')提供一个缺省的返回值''(一个空字符串)。
如果只是使用request.GET['q']访问变量,在Get数据时q不可得,可能引发KeyError.
其次,关于Q,Q对象在这个例子里用于建立复杂的查询,搜索匹配查询的任何书籍.技术上Q对象包含QuerySet,可以在附录C中进一步阅读.
在这个查询中,icontains使用SQL的LIKE操作符,是大小写不敏感的。
既然搜索依靠多对多域来实现,就有可能对同一本书返回多次查询结果(例如:
一本书有两个作者都符合查询条件)。
因此添加.distinct()过滤查询结果,消除重复部分。
现在仍然没有这个搜索视图的模板,可以如下实现:
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01//EN">
Search
{%ifquery%}
Resultsfor"{{query|escape}}":
{%ifresults%}
- {{book|escape}}
{%endfor%}
{%forbookinresults%}
{%else%}
Nobooksfound
{%endif%}
{%endif%}