Web2py-forms-validators

提供:Dev Guides
移動先:案内検索

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)

  • table 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)

フォームが検索フォームであるタプル(フォーム、レコード)を返します。

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'&plus;field,None)
   txtval = request.vars.get('txt'&plus;field,None)
   opval = request.vars.get('op'&plus;field,None)

row = TR(TD(INPUT(_type = "checkbox",_name = "chk"&plus;field,value = chkval == 'on')),
   TD(field),TD(SELECT(ops,_name = "op"&plus;field,value = opval)),
   TD(INPUT(_type = "text",_name = "txt"&plus;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}}

ここにそれがどのように見えるかです-

表示