Files
build-web-application-with-…/zh-tw/14.3.md
2019-02-26 01:40:54 +08:00

9.3 KiB
Raw Blame History

14.3 表單及驗證支援

在Web開發中對於這樣的一個流程可能很眼熟

  • 開啟一個網頁顯示出表單。
  • 使用者填寫並提交了表單。
  • 如果使用者提交了一些無效的資訊,或者可能漏掉了一個必填項,表單將會連同使用者的資料和錯誤問題的描述資訊返回。
  • 使用者再次填寫,繼續上一步過程,直到提交了一個有效的表單。

在接收端,指令碼必須:

  • 檢查使用者遞交的表單資料。
  • 驗證資料是否為正確的型別,合適的標準。例如,如果一個使用者名稱被提交,它必須被驗證是否只包含了允許的字元。它必須有一個最小長度,不能超過最大長度。使用者名稱不能與已存在的他人使用者名稱重複,甚至是一個保留字等。
  • 過濾資料並清理不安全字元,保證邏輯處理中接收的資料是安全的。
  • 如果需要預格式化資料資料需要清除空白或者經過HTML編碼等等。
  • 準備好資料,插入資料庫。

儘管上面的過程並不是很複雜,但是通常情況下需要編寫很多程式碼,而且為了顯示錯誤資訊,在網頁中經常要使用多種不同的控制結構。建立表單驗證雖簡單,實施起來實在枯燥無味。

表單和驗證

對於開發者來說一般開發過程都是相當複雜而且大多是在重複一樣的工作。假設一個場景專案中忽然需要增加一個表單資料那麼區域性程式碼的整個流程都需要修改。我們知道Go裡面struct是常用的一個數據結構因此beego的form採用了struct來處理表單資訊。

首先定義一個開發Web應用時相對應的struct一個欄位對應一個form元素透過struct的tag來定義相應的元素資訊和驗證資訊如下所示


type User struct{
	Username 	string 	`form:text,valid:required`
	Nickname 	string 	`form:text,valid:required`
	Age			int 	`form:text,valid:required|numeric`
	Email 		string 	`form:text,valid:required|valid_email`
	Introduce 	string 	`form:textarea`
}

定義好struct之後接下來在controller中這樣操作


func (this *AddController) Get() {
	this.Data["form"] = beego.Form(&User{})
	this.Layout = "admin/layout.html"
	this.TplNames = "admin/add.tpl"
}		

在範本中這樣顯示錶單


<h1>New Blog Post</h1>
<form action="" method="post">
{{.form.render()}}
</form>

上面我們定義好了整個的第一步從struct到顯示錶單的過程接下來就是使用者填寫資訊伺服器端接收資料然後驗證最後插入資料庫。


func (this *AddController) Post() {
	var user User
	form := this.GetInput(&user)
	if !form.Validates() {
		return
	}
	models.UserInsert(&user)
	this.Ctx.Redirect(302, "/admin/index")
}		

表單型別

以下列表列出來了對應的form元素資訊

名稱 引數 功能描述
text No textbox輸入框
button No 按鈕
checkbox No 多選擇框
dropdown No 下拉選擇框
file No 檔案上傳
hidden No 隱藏元素
password No 密碼輸入框
radio No 單選框
textarea No 文字輸入框

表單驗證

以下列表將列出可被使用的原生規則

規則 引數 描述 舉例
required No 如果元素為空則返回FALSE  
matches Yes 如果表單元素的值與引數中對應的表單欄位的值不相等則返回FALSE matches[form_item]
is_unique Yes 如果表單元素的值與指定資料表欄位有重複則返回False譯者注比如is_unique[User.Email]那麼驗證類別會去查詢User表中Email欄位有沒有與表單元素一樣的值如存重複則返回false這樣開發者就不必另寫Callback驗證程式碼。 is_unique[table.field]
min_length Yes 如果表單元素值的字元長度少於引數中定義的數字則返回FALSE min_length[6]
max_length Yes 如果表單元素值的字元長度大於引數中定義的數字則返回FALSE max_length[12]
exact_length Yes 如果表單元素值的字元長度與引數中定義的數字不符則返回FALSE exact_length[8]
greater_than Yes 如果表單元素值是非數字型別或小於引數定義的值則返回FALSE greater_than[8]
less_than Yes 如果表單元素值是非數字型別或大於引數定義的值則返回FALSE less_than[8]
alpha No 如果表單元素值中包含除字母以外的其他字元則返回FALSE  
alpha_numeric No 如果表單元素值中包含除字母和數字以外的其他字元則返回FALSE  
alpha_dash No 如果表單元素值中包含除字母/數字/下劃線/破折號以外的其他字元則返回FALSE  
numeric No 如果表單元素值中包含除數字以外的字元,則返回 FALSE  
integer No 如果表單元素中包含除整數以外的字元則返回FALSE  
decimal Yes 如果表單元素中輸入非小數不完整的值則返回FALSE  
is_natural No 如果表單元素值中包含了非自然數的其他數值 其他數值不包括零則返回FALSE。自然數形如0,1,2,3....等等。  
is_natural_no_zero No 如果表單元素值包含了非自然數的其他數值 其他數值包括零則返回FALSE。非零的自然數1,2,3.....等等。  
valid_email No 如果表單元素值包含不合法的email地址則返回FALSE  
valid_emails No 如果表單元素值中任何一個值包含不合法的email地址地址之間用英文逗號分割則返回FALSE。  
valid_ip No 如果表單元素的值不是一個合法的IP地址則返回FALSE。  
valid_base64 No 如果表單元素的值包含除了base64 編碼字元之外的其他字元則返回FALSE。