Web2py - 表单 & 验证

  • 简述

    web2py 具有强大的表单生成函数。在 web2py 中构建表单的四种不同方法如下 -
    • FORM - 就 HTML 助手而言,它被认为是低级实现。FORM 对象知道它的字段内容。
    • SQLFORM - 它为现有数据库提供创建、更新和删除的函数。
    • SQLFORM.factory - 它被认为是 SQLFORM 顶部的抽象层,它生成类似于 SQLFORM 的表单。在这里,不需要创建新的数据库。
    • CRUD 方法- 顾名思义,它提供了创建、检索、更新和删除函数,这些函数具有基于 SQLFORM 的类似函数。
  • 形式

    考虑一个应用程序,它接受用户的输入并有一个“提交”按钮来提交响应。

    控制器

    “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')
    )
    
    因此,对于创建的员工表,控制器中的修改将是 -
    
    def display_form():
       form = SQLFORM(db.person)
    
    View中没有任何修改。在新的控制器中,有必要构建一个 FORM,因为从表 db.employee 构建的 SQLFORM 构造函数在模型中定义。新表格在序列化时显示如下 -
    
    <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 也使用 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是在 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)
    返回表名和记录 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() 返回上述之一。
  • 创建表格

    让我们创建一个表单。按照下面给出的代码。

    模型

    在应用程序的模型文件夹下创建一个新模型。该文件的名称为“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}}
    
    这是它的样子 -
    视图