Web2py - Formlar ve Doğrulayıcılar
web2py, form oluşturma için güçlü işlevlerle birlikte gelir. Web2py'de formlar oluşturmanın dört farklı yolu aşağıdaki gibidir:
FORM- HTML yardımcıları açısından düşük seviyeli bir uygulama olarak kabul edilir. Bir FORM nesnesi, alan içeriğinin farkındadır.
SQLFORM - Mevcut veri tabanına Oluşturma, Güncelleme ve Silme işlevlerini sağlar.
SQLFORM.factory- SQLFORM'a benzer bir form oluşturan SQLFORM'un üstündeki soyutlama katmanı olarak kabul edilir. Burada yeni bir veritabanı oluşturmaya gerek yoktur.
CRUD Methods - Adından da anlaşılacağı gibi, SQLFORM'a dayalı benzer işlevlere sahip Oluşturma, Alma, Güncelleme ve Silme özellikleri sağlar.
FORM
Kullanıcıdan bir girdi kabul eden ve yanıtı göndermek için bir "gönder" düğmesi olan bir uygulama düşünün.
Kontrolör
"Default.py" denetleyicisi aşağıdaki ilişkili işlevi içerecektir
def display_form():
return dict()
Görünüm
İlişkili "default / display_form.html" görünümü, formun görüntüsünü HTML olarak şu şekilde işler:
{{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)}}
Yukarıdaki örnek, kullanıcı girdisini isteyen normal HTML biçimidir. FORM nesnesi gibi yardımcılar ile aynı form oluşturulabilir.
Kontrolör
def display_form():
form = FORM('Value:', INPUT(_value = 'name'), INPUT(_type = 'submit'))
return dict(form = form)
"Default.py" denetleyicisindeki yukarıdaki işlev, form oluşturulmasına yardımcı olan FORM nesnesini (HTML yardımcısı) içerir.
Görünüm
{{extend 'layout.html'}}
<h2>Basic form</h2>
{{= form}}
<h2>Submitted variables</h2>
{{= BEAUTIFY(request.vars)}}
İfadenin ürettiği formu {{= form}}FORM nesnesini serileştirir. Bir kullanıcı formu doldurup gönder düğmesini tıkladığında, form kendi kendine gönderir ve değişkenrequest.vars.value giriş değeri ile birlikte alt kısımda görüntülenir.
SQLFORM
Mevcut veritabanına bir form oluşturulmasına yardımcı olur. Uygulanması için adımlar aşağıda tartışılmaktadır.
DAL kullanılarak veritabanı ile bağlantı kurulması, bu aynı zamanda DAL yapıcısı olarak da adlandırılan DAL nesnesi kullanılarak oluşturulur. Bağlantı kurulduktan sonra kullanıcı ilgili tabloyu oluşturabilir.
db = DAL('sqlite://storage.sqlite')
db.define_table('employee', Field('name', requires = IS_NOT_EMPTY()))
Böylece “çalışan” adında bir tablo oluşturduk. Denetleyici, formu ve düğmeyi aşağıdaki ifadelerle oluşturur -
form = SQLFORM(
db.mytable,
record = mytable_index,
deletable = True,
submit_button = T('Update')
)
Bu nedenle, oluşturulan çalışan tablosu için kontrolördeki değişiklik şu şekilde olacaktır:
def display_form():
form = SQLFORM(db.person)
İçinde değişiklik yok View. Yeni denetleyicide, SQLFORM yapıcısı db.employee tablosundan bir tane oluşturduğundan, modelde bir FORM oluşturmak gerekir. Yeni form, serileştirildiğinde aşağıdaki gibi görünür -
<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>
Formdaki tüm etiketlerin tablodan ve alan adından türetilen adları vardır.
Bir SQLFORMnesnesi, yüklenen dosyaları "yüklemeler" klasörüne kaydederek "yükleme" alanlarıyla da ilgilenir. Bu otomatik olarak yapılır. SQLFORM, "Boolean" değerlerini onay kutuları ve metin değerleri şeklinde görüntüler.“textareas”.
SQLFORM ayrıca işlem yöntemini kullanır.Bu, kullanıcı ilişkili bir SQLFORM ile değerleri tutmak istiyorsa gereklidir.
Eğer form.process(keepvalues = True) sonra kabul edilir.
Misal
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 fabrikası
Bazen, kullanıcının, veritabanının uygulanmasına gerek kalmadan var olan bir veritabanı tablosu olacak şekilde bir form oluşturması gerekir. Kullanıcı sadece SQLFORM özelliğinden yararlanmak ister.
Bu, aracılığıyla yapılır form.factory ve bir oturumda tutulur.
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)
Form, alanları adı ve resmi olan SQLFORM gibi görünecek, ancak veritabanında böyle bir tablo yok.
"Default / form_from_factory.html" görünümü şu şekilde temsil edilecektir:
{{extend 'layout.html'}}
{{= form}}
CRUD Yöntemleri
CRUDSQLFORM'un üstünde kullanılan bir API'dir. Adından da anlaşılacağı gibi, uygun formun oluşturulması, alınması, güncellenmesi ve silinmesi için kullanılır.
CRUD, web2py'deki diğer API'lere kıyasla açığa çıkmaz; bu nedenle ithal edilmesi gerekir.
from gluon.tools import Crud
crud = Crud(db)
Yukarıda tanımlanan CRUD nesnesi aşağıdaki API'yi sağlar -
Sr.No | API ve İşlevsellik |
---|---|
1 | crud.tables() Veritabanında tanımlanan tabloların bir listesini döndürür. |
2 | crud.create(db.tablename) İçin bir oluşturma formu döndürür table tablename. |
3 | crud.read(db.tablename, id) İçin salt okunur bir form verir tablename ve kayıt kimliği. |
4 | crud.delete(db.tablename, id) kaydı siler |
5 | crud.select(db.tablename, query) Tablodan seçilen kayıtların bir listesini döndürür. |
6 | crud.search(db.tablename) Formun bir arama formu olduğu bir demet (form, kayıtlar) döndürür. |
7 | crud() Request.args () öğesine göre yukarıdakilerden birini döndürür. |
Form Yaratma
Bir form oluşturalım. Aşağıda verilen kodları takip edin.
Modeli
Altında yeni bir model oluşturulur modelsuygulamanın klasörü. Dosyanın adı“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
Kontrolör
İlişkili dosya, yani “dynamic_search.py” denetleyiciler bölümü aşağıdaki kodu içerecektir -
def index():
form,results = dynamic_search(db.things)
return dict(form = form,results = results)
Görünüm
Bunu aşağıdaki görünümle oluşturabiliriz.
{{extend 'layout.html'}}
{{= form}}
{{= results}}
İşte göründüğü gibi -