Web2py-양식 및 유효성 검사기

web2py는 양식 생성을위한 강력한 기능을 제공합니다. web2py에서 양식을 작성하는 네 가지 방법은 다음과 같습니다.

  • FORM− HTML 도우미 측면에서 저수준 구현으로 간주됩니다. FORM 개체는 해당 필드 내용을 인식합니다.

  • SQLFORM − 기존 데이터베이스에 생성, 업데이트, 삭제 기능을 제공합니다.

  • SQLFORM.factory− SQLFORM 상단의 추상화 계층으로 간주되어 SQLFORM과 유사한 형태를 생성합니다. 여기에서는 새 데이터베이스를 만들 필요가 없습니다.

  • CRUD Methods − 이름에서 알 수 있듯이 SQLFORM 기반의 유사한 기능으로 Create, Retrieve, Update, Delete 기능을 제공합니다.

형태

사용자의 입력을 받아들이고 응답을 제출하기위한 "제출"버튼이있는 애플리케이션을 고려하십시오.

제어 장치

“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 helper)가 포함되어 있습니다.

전망

{{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. 새 컨트롤러에서는 db.employee 테이블에서 빌드 된 SQLFORM 생성자가 모델에 정의되어 있으므로 FORM을 빌드해야합니다. 직렬화되면 새 양식은 다음과 같이 나타납니다.

<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객체는 또한 업로드 된 파일을 "uploads"폴더에 저장하여 "upload"필드를 처리합니다. 이것은 자동으로 수행됩니다. SQLFORM은 "Boolean"값을 확인란 및 텍스트 값의 형태로 표시합니다.“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 방법

CRUDSQLFORM 위에서 사용되는 API입니다. 이름에서 알 수 있듯이 적절한 양식의 생성, 검색, 업데이트 및 삭제에 사용됩니다.

web2py의 다른 API와 비교할 때 CRUD는 노출되지 않습니다. 따라서 가져와야합니다.

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

위에 정의 된 CRUD 객체는 다음 API를 제공합니다.

Sr. 아니요 API 및 기능
1

crud.tables()

데이터베이스에 정의 된 테이블 목록을 반환합니다.

2

crud.create(db.tablename)

생성 양식을 반환합니다. table tablename.

crud.read(db.tablename, id)

다음에 대한 읽기 전용 양식을 반환합니다. tablename 및 레코드 ID.

4

crud.delete(db.tablename, id)

기록을 삭제합니다

5

crud.select(db.tablename, query)

테이블에서 선택한 레코드 목록을 반환합니다.

6

crud.search(db.tablename)

양식이 검색 양식 인 튜플 (양식, 레코드)을 반환합니다.

7

crud()

request.args ()를 기반으로 위 중 하나를 반환합니다.

양식 생성

양식을 만들어 보겠습니다. 아래에 주어진 코드를 따르십시오.

모델

새 모델은 models응용 프로그램의 폴더. 파일 이름은 다음과 같습니다.“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}}

다음은 그 모습입니다.