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}}
Вот как это выглядит —