Учебники

Web2py — формы и валидаторы

web2py поставляется с мощными функциями для генерации форм. Четыре различных способа создания форм в web2py следующие:

  • ФОРМА — С точки зрения помощников HTML, это рассматривается как реализация низкого уровня. Объект FORM знает о содержимом своего поля.

  • SQLFORM — предоставляет функции создания, обновления и удаления для существующей базы данных.

  • SQLFORM.factory — рассматривается как уровень абстракции в верхней части SQLFORM, который генерирует форму, аналогичную SQLFORM. Здесь нет необходимости создавать новую базу данных.

  • Методы CRUD. Как следует из названия, он предоставляет функции создания, извлечения, обновления и удаления с аналогичными функциями на основе SQLFORM.

ФОРМА — С точки зрения помощников 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()))

Таким образом, мы создали таблицу с именем «сотрудник». Контроллер строит форму и кнопку со следующими утверждениями —

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

Следовательно, для созданной таблицы сотрудников изменение в контроллере будет:

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

В View нет изменений. В новом контроллере необходимо построить FORM, поскольку конструктор SQLFORM, созданный из таблицы db.employee, определен в модели. Новая форма после сериализации выглядит следующим образом:

<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 также работает с полями «upload», сохраняя загруженные файлы в папке «uploads». Это делается автоматически. 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_factory.html» будет представлено как —

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

Методы CRUD

CRUD — это API, используемый поверх SQLFORM. Как следует из названия, он используется для создания, поиска, обновления и удаления соответствующей формы.

CRUD, по сравнению с другими API в web2py, не выставляется; следовательно, необходимо, чтобы он был импортирован.

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

Определенный выше объект CRUD предоставляет следующий API —

Sr.No API и функциональность
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

падла ()

Возвращает один из вышеперечисленных на основе request.args ().

crud.tables ()

Возвращает список таблиц, определенных в базе данных.

crud.create (db.tablename)

Возвращает форму создания для имени таблицы .

crud.read (db.tablename, id)

Возвращает форму только для чтения для имени таблицы и идентификатора записи.

crud.delete (db.tablename, id)

удаляет запись

crud.select (db.tablename, query)

Возвращает список записей, выбранных из таблицы.

crud.search (db.tablename)

Возвращает кортеж (форму, записи), где форма — это форма поиска.

падла ()

Возвращает один из вышеперечисленных на основе 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}}

Вот как это выглядит —