此文檔提供基本的web表單介紹和Django中如何處理表單。關於更多的具體細節,能夠查閱更多詳細文檔。
除非你計劃構建的網站和應用不發佈任何內容,不接受用戶輸入的數據,不然你須要理解和使用表單。
Django提供一些工具和庫幫助你建立表單接收用戶的輸入,並處理和返回數據。html
在HTML中,表單在<form>..</form>
裏面收集用戶的輸入,例如一段文本,選擇按鈕等,而後發送輸入的信息到服務端。
一些表單接口元素,例如文本輸入、複選框都很是的簡單而且是HTML內置的,其餘的要複雜不少好比界面彈出日期選擇器、滑動滑塊,操縱這些特效一般會使用JavaScript和 CSS來實現。
關於<input>
元素,一個表單必須指定兩件事:程序員
一個例子,Django的Admin中有一個登錄表單,包含幾個<input>
元素,type="text"
對應username
,type="password"
對應password
,type="submit"
對應登陸按鈕,還包含一些對用戶隱藏的文本字段,令Django決定接下來要幹什麼。web
GET和POST是處理表單過程當中惟一使用的HTML方法
Django的login表單使用POST方法,在瀏覽器中打包表單數據,編碼傳輸,將其發送給服務器,而後接收返回的響應。
對比GET,綁定提交的數據到字符串生成URL,在URL中包含數據必須發送的地址以及數據的鍵和值,若是你在文檔中搜索能夠在功能中看見,將會爲表單生成這樣的URL:
https://docs.djangoproject.com/search/?q=forms&release=1.
GET和POST一般用於不一樣目的
一個請求若是用來改變系統的狀態,例如:一個請求改變了數據庫,應該使用POST,GET應該在不會改變系統狀態的狀況下使用。
GET不適合用於密碼錶單,由於密碼會出如今URL裏,所以,在瀏覽器的歷史記錄和服務器日誌的純文本中會出現密碼。它也不能適用於大量的數據,相似圖片的二進制數據。一個web應用使用GET請求管理員表單會帶來安全風險,攻擊者會很容易的模仿表單請求獲取系統敏感信息,POST結合其餘的保護措施,提供更多的訪問控制,例如:CSRF protection
在其餘方面,GET適合web搜索表單,由於這個URL的GET請求能夠方便的存爲書籤、共享、提交。數據庫
處理表單是一項複雜的業務,考慮Django管理員,衆多的數據和幾個不一樣的數據類型須要顯示在表單裏,渲染到HTML,使用方便的界面編輯,返回到服務器,驗證和清理,保存或進一步的加工處理。django
Django表單函數可使絕大部分的工做簡單化、自動化,而且比大多數程序員本身寫的代碼要安全。瀏覽器
Django處理3個不一樣的表單部分:安全
你可能想手動的完成這些功能,可是Django能夠幫你完成這些。服務器
咱們簡要的描述HTML表單,可是HTML<form>
只是一部分機械的要求。函數
在web應用程序的上下文,form多是指HTML<form>
,或Djangoform
類實例,或結構化數據提交時返回,或這些部位的端到端的集合。工具
這個系統組件的核心是Djangoform
類,在Django模型中描述了類似的邏輯結構對象,它的行爲,form
類描述表單如何工做和建立。
使用與model
類類似的字段映射數據庫方式,form
類字段映射HTML表單<input>
元素。
表單的字段是類自己,它們管理表單數據, 提交的時候執行驗證。DateField和FileField處理不一樣的數據,用它們作不一樣的事情。
一個表單字段表明一個用戶在瀏覽器中的widget(窗口部件)--用戶界面的機制,每一個字段類型有一個默認的Widget class,可是它們能夠按要求重寫。
在Django渲染一個對象,咱們通常:
1.在視圖(view)中抓住它(從數據庫中取出)
2.傳送它到模版文件
3.擴大到使用模版變量的HTML標籤
在模版中渲染一個表單與渲染其餘對象很類似,可是有些鍵值不同。
模型實例中不包含數據,且幾乎不多在模版中作任何有用的事情,另外一方面,它塑造一種完美的感受渲染一個未填充的表單,咱們想要用戶填充它,這就是咱們想要的。
當咱們在view中處理一個模型實例,咱們一般在數據庫中檢索,當咱們處理一個表單咱們一般在view中實例化它。
當咱們實例化一個表單,咱們能夠選擇讓它空着或者預填充,例如:
剩下的這些案例都是很是有趣的,它讓用戶不僅是閱讀網頁,發送信息與網站交互。
須要完成的工做
假設在你的網站上建立一個簡單的表單,獲取用戶的名字,你須要在模版(tempalte)中添加如下代碼:
<form action="/your-name/" method="post"> <label for="your_name">Your name: </label> <input id="your_name" type="text" name="your_name" value="{{ current_name }}"> <input type="submit" value="OK"> </form>
這些告訴瀏覽器返回表單數據到URL/your-name/,使用POST方法,它會顯示一個文本框,標記爲「your_name」,和一個按鈕標記爲「ok」,若是模版上下文包含一個current_name變量,將會預填充your_name字段。
你須要在view中渲染包含HTML表單的模版,而且能夠適當的綁定current_name字段
當表單提交以後,POST請求發送到服務器將包含表單數據。
如今你須要在view中處理相應的 /your-name/ URL映射,將會在請求發現相應的鍵/值對應,而後處理他們。
這是一個很是簡單的表單,在實踐中,一個表單可能包含幾十個甚至幾百個字段,這些可能須要預填充,咱們可能期待用戶在最後提交以前,分紅幾個週期編輯提交數據。
咱們可能須要一些驗證在瀏覽器中出現,即便在表單提交。咱們可能想要使用一些複雜的字段,容許用戶從日曆選擇日期等。