我在WTForms中遇到一个非常简单的任务我遇到了麻烦:检查一个字段是否输入了任何数据。似乎数据方法根据字段的类型返回不同的结果,所以我不能一般地使用它来测试它。
我在Flask应用中使用它。在我的表格声明中,我有:
title = StringField('Title')
signed = RadioField('Signed?', choices = [('Y','yes'),('N','no')])
然后,在我的views.py中,在“if 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”测试。因此,我必须使用form.signed.raw_data,它返回一个空列表,它是False。但我不能在所有实例中使用raw_data,因为form.title.raw_data不返回空列表,它返回一个由空字符串组成的列表,其中不是 True
有没有办法可以测试是否填写了任何类型的字段,还是我必须根据字段的类型在数据和raw_data之间切换?这是违反直觉和令人困惑的。
答案 0 :(得分:0)
在raw_data
中,表单字段的值为collected in a list。
您希望使用data
,因为其值为processed to its python representation。子类化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