2017-11-18 10 views
0

WTForms에서 매우 간단한 작업이라고 생각되는 문제가 있습니다. 필드에 입력 된 데이터가 있는지 확인하십시오. 데이터 메서드는 필드 형식에 따라 다른 결과를 반환하는 것으로 보입니다. 따라서이를 테스트하기 위해 일반적으로 사용할 수는 없습니다.WTForms : 필드가 채워 졌는지 테스트하십시오.

플라스크 (Flask) 앱에서 사용하고 있습니다. 내 양식 선언, 나는이 :

title = StringField('Title') 
signed = RadioField('Signed?', choices = [('Y','yes'),('N','no')]) 

을 그리고, 내 views.py에서, ") (form.is_submitted 경우"후 :

print('Title raw_data is %r' % form.title.raw_data) 
print('Title data is %r' % form.title.data) 
if form.title.raw_data: 
    print ("Title raw data is True") 
if form.title.data: 
    print ("Title data is True") 

print('Signed raw_data is %r' % form.signed.raw_data) 
print('Signed data is %r' % form.signed.data) 
if form.signed.raw_data: 
    print ("Signed raw data is True") 
if form.signed.data: 
    print ("Signed data is True") 

나는 이것을 실행하고 어느 필드를 작성하는 경우 형태로, 내가 얻을 :

입니다
Title raw_data is [''] 
Title data is '' 
Title raw data is True 
Signed raw_data is [] 
Signed data is 'None' 
Signed data is True 

이 form.title.data는 빈 문자열을 반환합니다, 그래서 테스트를 위해 이것을 사용할 수 있습니다; form.signed.data는 None이 아닌 'None'문자열을 반환하므로 "if form.signed.data"테스트가 실패합니다. 따라서 빈 목록 인 False를 반환하는 form.signed.raw_data를 사용해야합니다. form.title.raw_data는 빈 문자열을 반환하지 않기 때문에 빈 문자열로 구성된 목록을 반환합니다. 즉, 이 아닌이 아닌 경우

방법이 있습니까? 어떤 종류의 필드가 채워 졌는지 테스트 할 수 있습니까? 아니면 필드의 종류에 따라 데이터와 raw_data 사이를 전환해야합니까? 반 직관적이며 혼란 스럽습니다.

+0

, 당신은 = 빈 'FALSE'를 설정할 수 있습니다. – joshlsullivan

+0

죄송합니다. 어떤 문서에서이 내용을 찾을 수 없습니다 -이 작업의 수행 대상과 그 출처를 명확히 할 수 있습니까? Appengine 확장에 "allow_blank"및 "blank_text"가 있지만 Appengine을 사용하지 않습니다. – user1235777

+0

죄송합니다. 그것은 장고 기능입니다. WTF를 사용하면 유효성 검사기를 사용할 수 있습니다. 여기에서 문서를 살펴보십시오. [http://wtforms.readthedocs.io/en/latest/validators.html#wtforms.validators.DataRequired](http://wtforms.readthedocs.io/en/latest/validators). html # wtforms.validators.DataRequired). 'forms.py' 파일을 게시 할 수 있다면 더 나은 방향을 제시 할 수 있습니다. – joshlsullivan

답변

0

raw_data에서 값은 collected in a list입니다.

값이 processed to its python representation이므로 data으로 작업하고 싶습니다. wtforms.fields.core.Field 서브 클래 싱하는 대부분의 필드는 이것을 실현하는 자신의 process_formdata 메소드를 구현합니다. 과 같이 필드 데이터를 확인하는 도우미 함수를 구현하여

시작 : 디폴트 값이 필드 스키마에 지정된 경우 데이터가 밖으로 기본값으로 설정 시작

def is_filled(data): 
    if data == None: 
     return False 
    if data == '': 
     return False 
    if data == []: 
     return False 
    return True 

하는 것으로. 이 경우 raw_data을 사용하는 것이 더 정확합니다.

def is_filled(raw_data): 
    try: 
     value = raw_data[0] 
     if value == '': 
      return False 
    except (IndexError, TypeError): 
     return False 
    return True 

테스트 : 당신의 모델에서

>>> is_filled(None) 
False 
>>> is_filled([]) 
False 
>>> is_filled(['',]) 
False 
+0

첫 번째 예제에서 빈 문자열 None 및 빈 배열은 false로 평가되므로 세 번째 연산자'is_filled = True이면 else False '가 올바르게 작동합니다. – EndermanAPM

+0

@EndermanAPM 네 말이 맞아. 나는 이런 종류의 시나리오에서 _explicit가 implicit_보다 낫다는 경향이있다. –

+1

나는 보통 가능한 적은 복잡성으로 물건을 다루는 것에 몰두한다. 파이썬에 익숙하지 않은 개발자는 함수를 더 빠르게 이해할 수 있지만 일반적으로 파이썬 개발자는 함수를 확인하지 않아도됩니다. 결국 약간의 스트레칭이 필요합니다. 왜냐하면 함수 이름은 자명하고 몇 줄 밖에되지 않기 때문에 요지를 얻을 수 있습니다. – EndermanAPM