Web2py-forms-validators
Web2py-フォームとバリデーター
web2pyには、フォーム生成のための強力な機能が付属しています。 web2pyでフォームを構築する4つの異なる方法は次のとおりです-
- FORM -HTMLヘルパーに関しては、低レベルの実装と見なされます。 FORMオブジェクトは、そのフィールドの内容を認識しています。
- SQLFORM -既存のデータベースに対して、作成、更新、削除の機能を提供します。
- SQLFORM.factory -SQLFORMに類似したフォームを生成するSQLFORMの最上位の抽象化レイヤーと見なされます。 ここでは、新しいデータベースを作成する必要はありません。
- * CRUDメソッド*-名前が示すように、SQLFORMに基づいた同様の機能を持つCreate、Retrieve、Update、Delete機能を提供します。
FORM
ユーザーからの入力を受け入れ、応答を送信するための「送信」ボタンを備えたアプリケーションを考えます。
コントローラ
「default.py」コントローラには、次の関連関数が含まれます
def display_form():
return dict()
View
関連するビュー「default/display_forml」は、HTMLでのフォームの表示を次のようにレンダリングします-
{{extend 'layoutl'}}
<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ヘルパー)が含まれています。
View
{{extend 'layoutl'}}
<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')
)
したがって、作成された従業員テーブルの場合、コントローラの変更は次のようになります-
def display_form():
form = SQLFORM(db.person)
*View* には変更はありません。 新しいコントローラーでは、テーブルdb.employeeから構築されたSQLFORMコンストラクターがモデルで定義されているため、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* オブジェクトは、アップロードされたファイルを「アップロード」フォルダーに保存することにより、「アップロード」フィールドも処理します。 これは自動的に行われます。 SQLFORMは、 *"textareas"* を使用して、チェックボックスおよびテキスト値の形式で「ブール」値を表示します。
SQLFORMはプロセスメソッドも使用します。これは、ユーザーが関連する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_factoryl」ビューは次のように表されます-
{{extend 'layoutl'}}
{{= form}}
CRUDメソッド
*CRUD* は、SQLFORMの上で使用されるAPIです。 名前が示すように、適切なフォームの作成、取得、更新、削除に使用されます。
CRUDは、web2pyの他のAPIと比較して、公開されていません。したがって、インポートする必要があります。
from gluon.tools import Crud
crud = Crud(db)
上記で定義されたCRUDオブジェクトは、次のAPIを提供します-
Sr.No | API & Functionality |
---|---|
1 |
crud.tables() データベースで定義されているテーブルのリストを返します。 |
2 |
crud.create(db.tablename)
|
3 |
crud.read(db.tablename, id)
|
4 |
crud.delete(db.tablename, id) レコードを削除します |
5 |
crud.select(db.tablename, query) テーブルから選択されたレコードのリストを返します。 |
6 |
crud.search(db.tablename) フォームが検索フォームであるタプル(フォーム、レコード)を返します。 |
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)
View
次のビューでこれをレンダリングできます。
{{extend 'layoutl'}}
{{= form}}
{{= results}}
ここにそれがどのように見えるかです-