亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python的Django框架中的表單處理示例

 更新時(shí)間:2015年07月17日 15:47:20   投稿:goldensun  
這篇文章主要介紹了Python的Django框架中的表單處理示例,表單處理是Django中的基礎(chǔ)操作,需要的朋友可以參考下

組建一個(gè)關(guān)于書(shū)籍、作者、出版社的例子:

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()

我們現(xiàn)在來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的view函數(shù)以便讓用戶(hù)可以通過(guò)書(shū)名從數(shù)據(jù)庫(kù)中查找書(shū)籍。
通常,表單開(kāi)發(fā)分為兩個(gè)部分: 前端HTML頁(yè)面用戶(hù)接口和后臺(tái)view函數(shù)對(duì)所提交數(shù)據(jù)的處理過(guò)程。 第一部分很簡(jiǎn)單;現(xiàn)在我們來(lái)建立個(gè)view來(lái)顯示一個(gè)搜索表單:

from django.shortcuts import render_to_response

def search_form(request):
  return render_to_response('search_form.html')

這個(gè)view函數(shù)可以放到Python的搜索路徑的任何位置。 為了便于討論,咱們將它放在 books/views.py 里。

這個(gè) search_form.html 模板,可能看起來(lái)是這樣的:

<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進(jìn)來(lái)了,而不是用類(lèi)似 from mysite.views import search_form 這樣的語(yǔ)句,因?yàn)榍罢呖雌饋?lái)更簡(jiǎn)潔。)

現(xiàn)在,如果你運(yùn)行 runserver 命令,然后訪(fǎng)問(wèn)http://127.0.0.1:8000/search-form/,你會(huì)看到搜索界面。 非常簡(jiǎn)單。

不過(guò),當(dāng)你通過(guò)這個(gè)form提交數(shù)據(jù)時(shí),你會(huì)得到一個(gè)Django 404錯(cuò)誤。 這個(gè)Form指向的URL /search/ 還沒(méi)有被實(shí)現(xiàn)。 讓我們添加第二個(gè)視圖函數(shù)并設(shè)置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)

暫時(shí)先只顯示用戶(hù)搜索的字詞,以確定搜索數(shù)據(jù)被正確地提交給了Django,這樣你就會(huì)知道搜索數(shù)據(jù)是如何在這個(gè)系統(tǒng)中傳遞的。 簡(jiǎn)而言之:

    在HTML里我們定義了一個(gè)變量q。當(dāng)提交表單時(shí),變量q的值通過(guò)GET(method=”get”)附加在URL /search/上。

    處理/search/(search())的視圖通過(guò)request.GET來(lái)獲取q的值。

需要注意的是在這里明確地判斷q是否包含在request.GET中。就像上面request.META小節(jié)里面提到,對(duì)于用戶(hù)提交過(guò)來(lái)的數(shù)據(jù),甚至是正確的數(shù)據(jù),都需要進(jìn)行過(guò)濾。 在這里若沒(méi)有進(jìn)行檢測(cè),那么用戶(hù)提交一個(gè)空的表單將引發(fā)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)

查詢(xún)字符串參數(shù)

因?yàn)槭褂肎ET方法的數(shù)據(jù)是通過(guò)查詢(xún)字符串的方式傳遞的(例如/search/?q=django),所以我們可以使用requet.GET來(lái)獲取這些數(shù)據(jù)。我們知道在視圖里可以使用request.GET來(lái)獲取傳統(tǒng)URL里的查詢(xún)字符串(例如hours=3)。

獲取使用POST方法的數(shù)據(jù)與GET的相似,只是使用request.POST代替了request.GET。那么,POST與GET之間有什么不同?當(dāng)我們提交表單僅僅需要獲取數(shù)據(jù)時(shí)就可以用GET; 而當(dāng)我們提交表單時(shí)需要更改服務(wù)器數(shù)據(jù)的狀態(tài),或者說(shuō)發(fā)送e-mail,或者其他不僅僅是獲取并顯示數(shù)據(jù)的時(shí)候就使用POST。 在這個(gè)搜索書(shū)籍的例子里,我們使用GET,因?yàn)檫@個(gè)查詢(xún)不會(huì)更改服務(wù)器數(shù)據(jù)的狀態(tài)。 (如果你有興趣了解更多關(guān)于GET和POST的知識(shí),可以參見(jiàn)http://www.w3.org/2001/tag/doc/whenToUseGet.html。)

既然已經(jīng)確認(rèn)用戶(hù)所提交的數(shù)據(jù)是有效的,那么接下來(lái)就可以從數(shù)據(jù)庫(kù)中查詢(xún)這個(gè)有效的數(shù)據(jù)(同樣,在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.')

讓我們來(lái)分析一下上面的代碼:

  •     除了檢查q是否存在于request.GET之外,我們還檢查來(lái)reuqest.GET[‘q']的值是否為空。
  •     我們使用Book.objects.filter(title__icontains=q)獲取數(shù)據(jù)庫(kù)中標(biāo)題包含q的書(shū)籍。 icontains是一個(gè)查詢(xún)關(guān)鍵字。這個(gè)語(yǔ)句可以理解為獲取標(biāo)題里包含q的書(shū)籍,不區(qū)分大小寫(xiě)。
  •     這是實(shí)現(xiàn)書(shū)籍查詢(xún)的一個(gè)很簡(jiǎn)單的方法。 我們不推薦在一個(gè)包含大量產(chǎn)品的數(shù)據(jù)庫(kù)中使用icontains查詢(xún),因?yàn)槟菚?huì)很慢。 (在真實(shí)的案例中,我們可以使用以某種分類(lèi)的自定義查詢(xún)系統(tǒng)。 在網(wǎng)上搜索“開(kāi)源 全文搜索”看看是否有好的方法)

    最后,我們給模板傳遞來(lái)books,一個(gè)包含Book對(duì)象的列表。 查詢(xún)結(jié)果的顯示模板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的使用,這個(gè)過(guò)濾器在適當(dāng)?shù)臅r(shí)候會(huì)輸出s(例如找到多本書(shū)籍)。

相關(guān)文章

  • python本地降級(jí)pip的方法步驟

    python本地降級(jí)pip的方法步驟

    高版本的pip在使用過(guò)程中會(huì)出現(xiàn)很多的不兼容問(wèn)題,而且不留神很容易把pip給升級(jí)了,下面這篇文章主要給大家介紹了關(guān)于python本地降級(jí)pip的方法步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 利用Python判斷文件的幾種方法及其優(yōu)劣對(duì)比

    利用Python判斷文件的幾種方法及其優(yōu)劣對(duì)比

    任何的編程語(yǔ)言都離不開(kāi)文件操作,文件操作主要是幫助我們更好的創(chuàng)建打開(kāi)文件,讀取文件中的內(nèi)容、或是把我們想要保存的內(nèi)容寫(xiě)入文件中、或是管理文件目錄等等,下面這篇文章主要給大家介紹了關(guān)于利用Python判斷文件的幾種方法及其優(yōu)劣對(duì)比的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • python 打印直角三角形,等邊三角形,菱形,正方形的代碼

    python 打印直角三角形,等邊三角形,菱形,正方形的代碼

    這篇文章主要介紹了python 打印直角三角形,等邊三角形,菱形,正方形的代碼,需要的朋友可以參考下
    2017-11-11
  • python獲取Linux發(fā)行版名稱(chēng)

    python獲取Linux發(fā)行版名稱(chēng)

    這篇文章主要介紹了python獲取Linux發(fā)行版名稱(chēng)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python 數(shù)值區(qū)間處理_對(duì)interval 庫(kù)的快速入門(mén)詳解

    Python 數(shù)值區(qū)間處理_對(duì)interval 庫(kù)的快速入門(mén)詳解

    今天小編就為大家分享一篇Python 數(shù)值區(qū)間處理_對(duì)interval 庫(kù)的快速入門(mén)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 在Python中使用Neo4j的方法

    在Python中使用Neo4j的方法

    今天小編就為大家分享一篇關(guān)于在Python中使用Neo4j的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • python sqlalchemy動(dòng)態(tài)修改tablename兩種實(shí)現(xiàn)方式

    python sqlalchemy動(dòng)態(tài)修改tablename兩種實(shí)現(xiàn)方式

    這篇文章主要介紹了python sqlalchemy動(dòng)態(tài)修改tablename兩種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-03-03
  • PyCharm配置anaconda環(huán)境的步驟詳解

    PyCharm配置anaconda環(huán)境的步驟詳解

    PyCharm是一款很好用很流行的python編輯器。Anaconda通過(guò)管理工具包、開(kāi)發(fā)環(huán)境、Python版本,大大簡(jiǎn)化了你的工作流程。今天通過(guò)本文給大家分享PyCharm配置anaconda環(huán)境,感興趣的朋友一起看看吧
    2020-07-07
  • Python用于學(xué)習(xí)重要算法的模塊pygorithm實(shí)例淺析

    Python用于學(xué)習(xí)重要算法的模塊pygorithm實(shí)例淺析

    這篇文章主要介紹了Python用于學(xué)習(xí)重要算法的模塊pygorithm,結(jié)合實(shí)例形式簡(jiǎn)單分析了pygorithm模塊的功能、算法調(diào)用、源碼獲取、時(shí)間復(fù)雜度計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • Python中的異常處理相關(guān)語(yǔ)句基礎(chǔ)學(xué)習(xí)筆記

    Python中的異常處理相關(guān)語(yǔ)句基礎(chǔ)學(xué)習(xí)筆記

    這里我們簡(jiǎn)單整理一下Python中的異常處理相關(guān)語(yǔ)句基礎(chǔ)學(xué)習(xí)筆記,包括try...except與assert等基本語(yǔ)句的用法講解:
    2016-07-07

最新評(píng)論