WTForms:测试字段是否填写

时间:2017-11-18 15:59:42

标签: python flask wtforms

我在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之间切换?这是违反直觉和令人困惑的。

1 个答案:

答案 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