Web2py - Formularze i walidatory
Platforma web2py zawiera zaawansowane funkcje do generowania formularzy. Cztery różne sposoby tworzenia formularzy w web2py są następujące -
FORM- Pod względem pomocników HTML jest to implementacja niskiego poziomu. Obiekt FORM jest świadomy zawartości swojego pola.
SQLFORM - Zapewnia funkcje tworzenia, aktualizacji i usuwania do istniejącej bazy danych.
SQLFORM.factory- Jest uważany za warstwę abstrakcji na górze SQLFORM, która generuje formularz podobny do SQLFORM. Tutaj nie ma potrzeby tworzenia nowej bazy danych.
CRUD Methods - Jak sama nazwa wskazuje, zapewnia funkcje tworzenia, pobierania, aktualizowania i usuwania z podobnymi funkcjami opartymi na SQLFORM.
FORMULARZ
Rozważ aplikację, która akceptuje dane wejściowe od użytkownika i ma przycisk „wyślij” do przesłania odpowiedzi.
Kontroler
Kontroler „default.py” będzie zawierał następującą skojarzoną funkcję
def display_form():
return dict()
Widok
Powiązany widok „default / display_form.html” spowoduje wyświetlenie formularza w HTML jako -
{{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)}}
Powyższy przykład to zwykły formularz HTML, który prosi o wprowadzenie danych przez użytkownika. Ten sam formularz można wygenerować za pomocą pomocników, takich jak obiekt FORM.
Kontroler
def display_form():
form = FORM('Value:', INPUT(_value = 'name'), INPUT(_type = 'submit'))
return dict(form = form)
Powyższa funkcja w kontrolerze „default.py” zawiera obiekt FORM (pomocnik HTML), który pomaga w tworzeniu formularza.
Widok
{{extend 'layout.html'}}
<h2>Basic form</h2>
{{= form}}
<h2>Submitted variables</h2>
{{= BEAUTIFY(request.vars)}}
Formularz, który jest generowany przez oświadczenie {{= form}}serializuje obiekt FORM. Gdy użytkownik wypełni formularz i kliknie przycisk przesyłania, formularz przesyła się automatycznie i zmiennarequest.vars.value wraz z wartością wejściową jest wyświetlana na dole.
SQLFORM
Pomaga w tworzeniu formularza do istniejącej bazy danych. Kroki prowadzące do jego wdrożenia omówiono poniżej.
Nawiązując połączenie z bazą danych za pomocą DAL, jest to tworzone za pomocą obiektu DAL zwanego również konstruktorem DAL. Po nawiązaniu połączenia użytkownik może utworzyć odpowiednią tabelę.
db = DAL('sqlite://storage.sqlite')
db.define_table('employee', Field('name', requires = IS_NOT_EMPTY()))
W ten sposób stworzyliśmy tabelę o nazwie „pracownik”. Kontroler buduje formularz i przycisk z następującymi instrukcjami -
form = SQLFORM(
db.mytable,
record = mytable_index,
deletable = True,
submit_button = T('Update')
)
Dlatego dla utworzonej tabeli pracowników modyfikacja w kontrolerze byłaby -
def display_form():
form = SQLFORM(db.person)
Nie ma modyfikacji w View. W nowym kontrolerze konieczne jest zbudowanie FORMU, gdyż w modelu zdefiniowany jest konstruktor SQLFORM zbudowany z tabeli db.employee. Nowy formularz po serializacji wygląda następująco -
<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>
Wszystkie tagi w formularzu mają nazwy pochodzące z tabeli i nazwy pola.
Na SQLFORMobiekt zajmuje się również polami „upload”, zapisując przesłane pliki w folderze „uploads”. Odbywa się to automatycznie. SQLFORM wyświetla wartości „boolowskie” w postaci pól wyboru i wartości tekstowych za pomocą“textareas”.
SQLFORM używa również metody process, co jest konieczne, jeśli użytkownik chce zachować wartości z powiązanym SQLFORM.
Gdyby form.process(keepvalues = True) wtedy jest akceptowany.
Przykład
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
Czasami użytkownik musi wygenerować formularz w taki sposób, aby istniała tabela bazy danych bez implementacji bazy danych. Użytkownik chce po prostu skorzystać z możliwości SQLFORM.
Odbywa się to poprzez form.factory i jest utrzymywany w sesji.
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)
Formularz będzie wyglądał jak SQLFORM z nazwą i obrazem jako jego polami, ale w bazie danych nie ma takiej tabeli.
Widok „default / form_from_factory.html” będzie reprezentował -
{{extend 'layout.html'}}
{{= form}}
Metody CRUD
CRUDjest interfejsem API używanym nad SQLFORM. Jak sama nazwa wskazuje, służy do tworzenia, wyszukiwania, aktualizacji i usuwania odpowiedniego formularza.
CRUD, w porównaniu z innymi interfejsami API w web2py, nie jest ujawniany; dlatego konieczne jest, aby był importowany.
from gluon.tools import Crud
crud = Crud(db)
Zdefiniowany powyżej obiekt CRUD udostępnia następujący interfejs API -
Sr.No | API i funkcjonalność |
---|---|
1 | crud.tables() Zwraca listę tabel zdefiniowanych w bazie danych. |
2 | crud.create(db.tablename) Zwraca formularz tworzenia dla table tablename. |
3 | crud.read(db.tablename, id) Zwraca formularz tylko do odczytu dla tablename i numer identyfikacyjny. |
4 | crud.delete(db.tablename, id) usuwa rekord |
5 | crud.select(db.tablename, query) Zwraca listę rekordów wybranych z tabeli. |
6 | crud.search(db.tablename) Zwraca krotkę (formularz, rekordy), gdzie formularz jest formularzem wyszukiwania. |
7 | crud() Zwraca jedno z powyższych na podstawie request.args (). |
Tworzenie formy
Stwórzmy formularz. Postępuj zgodnie z kodami podanymi poniżej.
Model
Nowy model jest tworzony pod modelsfolder aplikacji. Nazwa pliku to“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
Kontroler
Powiązany plik, a mianowicie “dynamic_search.py” w sekcji kontrolery będzie zawierać następujący kod -
def index():
form,results = dynamic_search(db.things)
return dict(form = form,results = results)
Widok
Możemy to wyrenderować za pomocą następującego widoku.
{{extend 'layout.html'}}
{{= form}}
{{= results}}
Oto, jak to wygląda -