2013-05-07 3 views
0

:WTForms 양식 필드 기본값을 억제하는 간단한 방법이 있습니까? 나는 데이터베이스에서 데이터를 표시 할 WTForms 양식을 사용할 때마다

sql = "SELECT * FROM rolodex WHERE rolodex_id = " + rolodex_id 
cursor = mdb_connect("DictCursor") 
cursor.execute(sql) 
row = cursor.fetchone() 
form = RolodexEntry(**row) 
return bottle.template('entry',rolodex_id=rolodex_id,form=form) 

(모든 양식 필드가 TextField의입니다)

비어 NULL 데이터베이스 필드 값은 "없음"으로 표시됩니다. 나는 그들이 단지 비어 있기를 바란다. 이 문제를 해결하는 몇 가지 방법을 생각할 수 있지만 None이 아닌 빈 문자열로 Textfield의 기본값을 설정하는 WTForms 승인 방법이 있는지 궁금합니다.

firstname = TextField('First Name',[validators.length(max=40)], default="") 

:

<p style='font-weight: bold; color: blue; margin-left: auto; margin-right: auto; width: 50%'> 
% if form.firstname.data: 
    {{form.firstname.data}} 
% end 
% if form.lastname.data: 
    {{form.lastname.data}} 
% end 
</p> 

나는 필드 정의의 기본 속성을 변경 시도 :

병 템플릿은 나에게 사례별로이 문제를 해결하는 간단한 경우 다소 지루한 방법을 제공 그러나 이것은 아무 것도하지 않았다. 필드가 데이터베이스에서 비어 있으면 form.firstname.data는 여전히 None으로 표시됩니다.

답변

0

나는 WTForms가 기본값으로 설정 한 승인 된 방법을 생각할 수없는 것 같습니다. 기본값으로 전달되는 값은 음 ..default입니다. 따라서 데이터베이스 선택 레벨에서 이것을 목표로한다면이 질문과 같은 것을 사용할 수 있습니다.

sql = "SELECT * FROM rolodex WHERE rolodex_id = " + rolodex_id 
default_value = None 
cursor = mdb_connect("DictCursor") 
cursor.execute(sql) 
row = cursor.fetchone() 
row = [value for value in row if value else default_value] 
form = RolodexEntry(*row) 
return bottle.template('entry',rolodex_id=rolodex_id,form=form) 

을하고 기본값으로 대신 빈 문자열의 None이있을 것이다;

How to override NULL value from aggregate query using MySQLdb module in python?

그래서 당신의 코드로 결합

firstname = TextField('First Name',[validators.length(max=40)], default=None) 

그게 도움이 될까요?

+0

안녕하세요. 회신 해 주셔서 감사합니다. 그러나 이것이 도움이되는 방식을 따르지는 않습니다. 필자의 경우 데이터베이스에는 빈 필드와 NULL 필드가 모두 포함되어 있습니다 (즉, 일부 데이터베이스 필드는 이미 ""로 설정되어 있습니다). 어느 경우이든, form.field_name.data는 결과 HTML 페이지 (즉, N-o-n-e 문자)에'None'으로 인쇄합니다. 이걸 보면'row'의 거짓 값은'None'으로 출력 될 것입니다. 데이터베이스의 값이'False' 인 경우 필드를 공백으로 두는 것을 기본값으로하고 싶기 때문에 필드 값을 사전에 미리 설정해도 도움이되지 않습니다 (다음 주석 참조). – pgoetz

+0

사실 필드 중 하나를 명시 적으로 ""(빈 문자열) :'row [ 'cellphone'] = ""'폼에 전달하기 전에'form = RolodexEntry (** row)' 그것은 여전히 ​​HTML 파일에'None'으로 출력됩니다. 이해가 안되는 이유는 이것이'default' 필드 속성에 의해 다루어지지 않는 이유입니다. – pgoetz

+0

실험 - 같은 것을 다시 할 때 ('row [ 'cellphone'] = ''')를 설정하고'firstname = TextField ('First Name', [validators.length (max = 40)]를 설정하면 어떻게됩니까? default = "Test string")'그리고 무엇이 표시되는지보십시오. 이것은'default'가 처리 중인지 확인합니다. 빈 문자열을 '없음'또는 문자열로 취급하는지 확인하고 싶습니다. – Ewan

1

문제가 I 모든 텍스트 필드에 사용 된 strip_filter 필터에 의해 야기되는 하였다

strip_filter = lambda x: x.strip() if x else None 

같은

cell = TextField('Cellphone', [validators.length(max=25)], 
       filters=[strip_filter]) 

조에 스트립 필터 변경은 :

strip_filter = lambda x: x.strip() if x else "" 

해결 이 문제.

WTForms default 필드 특성이 작동하지 않는 것으로 인해 문제가 발생했습니다.

cell = TextField('Cellphone', default = "Nada") 

이 코드 :이 필드 정의 사용

row['cell'] = "" 
form = RolodexEntry(**row) 
return bottle.template('entry',rolodex_id=rolodex_id,form=form) 

<td>{{form.cell.data}}</td>에 대한 HTML은 <td></td> 제공하지를 <td>Nada</td>

+0

추가 실험에서 WTForms 기본 필드 속성은 필드가 완전히 누락 된 경우에만 사용된다는 것이 분명해졌습니다. 특히 앞의 코드 예제에서'row [ 'cell'] = ""'를'del row [ 'cell']'로 대체하고 Nada가'form.cell.data' – pgoetz

0

이 문제는 오늘 나에게 발생하지만, 난 그렇게 내를 Flask_WTF를 사용 구문이 다릅니다. 내 솔루션은 내 validators[] 목록에 Optional()을 추가하여 해결되었습니다.

address_zip_extension = StringField('address_zip_extension', render_kw={"placeholder": "Zip Extension", "section": "address", 
            'label': 'Zip Extension'}, validators=[Optional(), Length(min=4, max=5)]) 

정상적인 WTForm의 경우 문법이 다르지만 다음과 같은 내용이 효과가 있다고 생각합니다.

class MyForm(Form): 
    name = TextField('Name', [Optional(), my_length_check]) 

행운을 빌어 요!