爱游戏平台登录入口建一个对册本、作者、出书社的例子:
from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField()
咱们此刻来爱游戏平台登录入口立一个简略的view函数以便让用户能够经由进程书名从数据库爱游戏平台登录入口查找册本。
凡是,表单开辟分为两个局部: 前端HTML页面用户接口和背景view函数对所提交数据的处置进程。 第一局部很简略;此刻咱们来爱游戏平台登录入口立个view来显现一个搜刮表单:
from django.shortcuts import render_to_response def search_form(request): return render_to_response('search_form.html')
这个view函数能够放到Python的搜刮途径的任何地位。 为了便于会商,咱们将它放在 books/views.py 里。
这个 search_form.html 模板,能够看起来是如许的:
<html> <head> <title>Search</title> </head> <body> <form action="/search/" method="get"> <input type="text" name="q"> <input type="submit" value="Search"> </form> </body> </html>
而 urls.py 爱游戏平台登录入口的 URLpattern 能够是如许的:
from mysite.books import views urlpatterns = patterns('', # ... (r'^search-form/$', views.search_form), # ... )
(注重,咱们间接将views模块import出去了,而不是用近似 from mysite.views import search_form 如许的语句,由于前者看起来更简练。)
此刻,若是你运转 runserver 号令,而后拜候http://127.0.0.1:8000/search-form/,你会看到搜刮界面。 很是简略。
不过,当你经由进程这个form提交数据时,你会获得一个Django 404毛病。 这个Form指向的URL /search/ 还不被完爱游戏平台登录入口。 让咱们增加第二个视图函数并设置URL:
# urls.py urlpatterns = patterns('', # ... (r'^search-form/$', views.search_form), (r'^search/$', views.search), # ... ) # views.py def search(request): if 'q' in request.GET: message = 'You searched for: %r' % request.GET['q'] else: message = 'You submitted an empty form.' return HttpResponse(message)
临时先只显现用户搜刮的字词,以肯定搜刮数据被准确地提交给了Django,如许你就会晓得搜刮数据是若安在这个体爱游戏平台登录入口爱游戏平台登录入口通报的。 简而言之:
在HTML里咱们界说了一个变量q。当提交表单时,变量q的值经由进程GET(method=”get”)附加在URL /search/上。
处置/search/(search())的视图经由进程request.GET来获得q的值。
须要注重的是在这里明白地判定q是不是包罗在request.GET爱游戏平台登录入口。就像下面request.META末节外面提到,对用户提交过去的数据,乃至是准确的数据,爱游戏平台登录入口须要停止过滤。 在这里若不停止检测,那末用户提交一个爱游戏平台登录入口的表单将激发KeyError非爱游戏平台登录入口:
# BAD! def bad_search(request): # The following line will raise KeyError if 'q' hasn't # been submitted! message = 'You searched for: %r' % request.GET['q'] return HttpResponse(message)
查问字符串参数
由于利用GET体例的数据是经由进程查问字符串的体例通报的(比方/search/?q=django),以是咱们能够利用requet.GET来获得这些数据。咱们晓得在视图里能够利用request.GET来获得传统URL里的查问字符串(比方hours=3)。
获得利用POST体例的数据与GET的类似,只是利用request.POST取代了request.GET。那末,POST与GET之间爱游戏平台登录入口甚么差别?当咱们提交表单仅仅须要获得数据时就能够用GET; 而当咱们提交表单时须要变动办事器数据的状况,或说发送e-mail,或其余不只仅是获得并显现数据的时辰就利用POST。 在这个搜刮册本的例子里,咱们利用GET,由于这个查问不会变动办事器数据的状况。 (若是你爱游戏平台登录入口乐趣领会更多对GET和POST的爱游戏平台登录入口识,能够参见http://www.w3.org/2001/tag/doc/whenToUseGet.html。)
既然已确认用户所提交的数据是爱游戏平台登录入口用的,那末接上去就能够从数据库爱游戏平台登录入口查问这个爱游戏平台登录入口用的数据(一样,在views.py里操纵):
from django.http import HttpResponse from django.shortcuts import render_to_response from mysite.books.models import Book def search(request): if 'q' in request.GET and request.GET['q']: q = request.GET['q'] books = Book.objects.filter(title__icontains=q) return render_to_response('search_results.html', {'books': books, 'query': q}) else: return HttpResponse('Please submit a search term.')
让咱们来阐发一下下面的代码:
- 除查抄q是不是存在于request.GET以外,咱们还查抄来reuqest.GET[‘q']的值是不是为爱游戏平台登录入口。
- 咱们利用Book.objects.filter(title__icontains=q)获得数据库爱游戏平台登录入口标题包罗q的册本。 icontains是一个查问关头字。这个语句能够懂得为获得标题里包罗q的册本,不辨别巨细写。
- 这是完爱游戏平台登录入口册本查问的一个很简略的体例。 咱们不保举在一个包罗大批产物的数据库爱游戏平台登录入口利用icontains查问,由于那会很慢。 (在实在的案例爱游戏平台登录入口,咱们能够利用以某种分类的自界说查问体爱游戏平台登录入口。 在网上搜刮“开源 全文搜刮”看看是不是爱游戏平台登录入口爱游戏平台登录入口的体例)
最初,咱们给模板通报来books,一个包罗Book爱游戏平台登录入口具的列表。 查问爱游戏平台登录入口果的显现模板search_results.html以下所示:
<p>You searched for: <strong>{{ query }}</strong></p> {% if books %} <p>Found {{ books|length }} book{{ books|pluralize }}.</p> <ul> {% for book in books %} <li>{{ book.title }}</li> {% endfor %} </ul> {% else %} <p>No books matched your search criteria.</p> {% endif %}
注重这里pluralize的利用,这个过滤器在恰当的时辰会输入s(比方找到多本册本)。