Web2py - 表單與驗證器



web2py 提供了強大的表單生成功能。在 web2py 中構建表單有四種不同的方法,如下所示:

  • FORM - 就 HTML 輔助函式而言,它被認為是低階實現。FORM 物件知道其欄位內容。

  • SQLFORM - 它為現有資料庫提供建立、更新和刪除的功能。

  • SQLFORM.factory - 它被認為是 SQLFORM 之上的抽象層,它生成類似於 SQLFORM 的表單。在這裡,不需要建立新的資料庫。

  • CRUD 方法 - 顧名思義,它提供了建立、檢索、更新和刪除功能,其功能基於 SQLFORM。

FORM

考慮一個應用程式,它接受使用者的輸入,並有一個“提交”按鈕來提交響應。

控制器

“default.py”控制器將包含以下關聯函式

def display_form():
   return dict()

檢視

關聯的檢視“default/display_form.html”將以 HTML 形式呈現表單的顯示,如下所示:

{{extend 'layout.html'}}
<h2>Basic Form</h2>

<form enctype = "multipart/form-data" action = "{{= URL()}}" method = "post">
   Your name:
   <input name = "name" />
   <input type = "submit" />
</form>

<h2>Submitted variables</h2>
{{= BEAUTIFY(request.vars)}}

以上示例是普通的 HTML 表單,它要求使用者輸入。可以使用 FORM 物件等輔助函式生成相同的表單。

控制器

def display_form():
   form = FORM('Value:', INPUT(_value = 'name'), INPUT(_type = 'submit'))
   return dict(form = form)

“default.py”控制器中的上述函式包含 FORM 物件(HTML 輔助函式),它有助於建立表單。

檢視

{{extend 'layout.html'}}
<h2>Basic form</h2>

{{= form}}
<h2>Submitted variables</h2>

{{= BEAUTIFY(request.vars)}}

由語句{{= form}}生成的表單會序列化 FORM 物件。當用戶填寫表單並單擊提交按鈕時,表單會自行提交,並且變數request.vars.value及其輸入值將顯示在底部。

SQLFORM

它有助於為現有資料庫建立表單。下面討論了其實現步驟。

使用 DAL 建立與資料庫的連線,這是使用 DAL 物件建立的,也稱為 DAL 建構函式。建立連線後,使用者可以建立相應的表。

db = DAL('sqlite://storage.sqlite')
db.define_table('employee', Field('name', requires = IS_NOT_EMPTY()))

因此,我們建立了一個名為“employee”的表。控制器使用以下語句構建表單和按鈕:

form = SQLFORM(
   db.mytable,
   record = mytable_index,
   deletable = True,
   submit_button = T('Update')
)

因此,對於建立的 employee 表,控制器中的修改將為:

def display_form():
   form = SQLFORM(db.person)

檢視沒有修改。在新控制器中,有必要構建一個 FORM,因為在模型中定義的 SQLFORM 建構函式從表 db.employee 構建了一個 FORM。新表單序列化後,顯示如下:

<form enctype = "multipart/form-data" action = "" method = "post">
   
   <table>
      <tr id = "employee_name__row">
         <td>
            <label id = "person_name__label" for = "person_name">Your name: </label>
         </td>
         
         <td>
            <input type = "text" class = "string" name = "name" value = "" id = "employee_name" />
         </td>
         
         <td></td>
      </tr>

      <tr id = "submit_record__row">
         <td></td>
         <td><input value = "Submit" type = "submit" /></td>
         <td></td>
      </tr>
		
   </table>

   <input value = "9038845529" type = "hidden" name = "_formkey" />
   <input value = "employee" type = "hidden" name = "_formname" />
	
</form>

表單中的所有標籤都具有從表和欄位名稱派生的名稱。

SQLFORM 物件還可以處理“上傳”欄位,方法是將上傳的檔案儲存在“uploads”資料夾中。這是自動完成的。SQLFORM 使用複選框顯示“布林”值,並使用“textareas”顯示文字值。

SQLFORM 還使用 process 方法。如果使用者希望保留與關聯的 SQLFORM 關聯的值,則需要此方法。

如果form.process(keepvalues = True),則會被接受。

示例

def display_form():
   form = SQLFORM(db.employee)
if form.process().accepted:
   response.flash = 'form accepted'

elif form.errors:
   response.flash = 'form has errors'
else:
   response.flash = 'please fill out the form'

return dict(form = form)

SQLFORM.factory

有時,使用者需要以一種存在現有資料庫表但沒有實現資料庫的方式生成表單。使用者只是想利用 SQLFORM 的功能。

這是透過form.factory完成的,它儲存在會話中。

def form_from_factory():
   form = SQLFORM.factory(
      Field('your_name', requires = IS_NOT_EMPTY()),
      Field('your_image', 'upload'))

   if form.process().accepted:
      response.flash = 'form accepted'
      session.your_name = form.vars.your_name
      session.your_image = form.vars.your_image
   elif form.errors:
      response.flash = 'form has errors'

   return dict(form = form)

表單將顯示為 SQLFORM,其欄位為名稱和影像,但資料庫中不存在這樣的表。

“default/form_from_factory.html”檢視將表示為:

{{extend 'layout.html'}}
{{= form}}

CRUD 方法

CRUD 是在 SQLFORM 之上使用的 API。顧名思義,它用於建立、檢索、更新和刪除相應的表單。

與 web2py 中的其他 API 相比,CRUD 沒有公開;因此,有必要匯入它。

from gluon.tools import Crud
crud = Crud(db)

上面定義的 CRUD 物件提供了以下 API:

序號 API 與功能
1

crud.tables()

返回資料庫中定義的表列表。

2

crud.create(db.tablename)

返回表 tablename的建立表單。

3

crud.read(db.tablename, id)

返回tablename和記錄 id 的只讀表單。

4

crud.delete(db.tablename, id)

刪除記錄

5

crud.select(db.tablename, query)

返回從表中選定的記錄列表。

6

crud.search(db.tablename)

返回一個元組 (form, records),其中 form 是搜尋表單。

7

crud()

根據 request.args() 返回上述內容之一。

表單建立

讓我們建立一個表單。請遵循以下程式碼。

模型

在應用程式的models資料夾下建立一個新模型。檔名為“dynamic_search.py”

def build_query(field, op, value):
   if op == 'equals':
      return field == value
   
   elif op == 'not equal':
      return field != value
   
   elif op == 'greater than':
      return field > value
   
   elif op == 'less than':
      return field < value
   
   elif op == 'starts with':
      return field.startswith(value)
   
   elif op == 'ends with':
      return field.endswith(value)
   
   elif op == 'contains':
      return field.contains(value)

def dynamic_search(table):
   tbl = TABLE()
   selected = []
   ops = ['equals', 
      'not equal',
      'greater than',
      'less than',
      'starts with',
      'ends with',
      'contains']
		
query = table.id > 0

for field in table.fields:
   chkval = request.vars.get('chk'+field,None)
   txtval = request.vars.get('txt'+field,None)
   opval = request.vars.get('op'+field,None)
	
row = TR(TD(INPUT(_type = "checkbox",_name = "chk"+field,value = chkval == 'on')),
   TD(field),TD(SELECT(ops,_name = "op"+field,value = opval)),
   TD(INPUT(_type = "text",_name = "txt"+field,_value = txtval)))
	
tbl.append(row)

if chkval:
   if txtval:
      query &= build_query(table[field], opval,txtval)
      selected.append(table[field])
      form = FORM(tbl,INPUT(_type="submit"))
      results = db(query).select(*selected)
   return form, results

控制器

控制器部分中的關聯檔案“dynamic_search.py”將包含以下程式碼:

def index():
   form,results = dynamic_search(db.things)
   return dict(form = form,results = results)

檢視

我們可以使用以下檢視呈現它。

{{extend 'layout.html'}}
{{= form}}
{{= results}}

它看起來像這樣:

View
廣告

© . All rights reserved.