我正在尝试验证wtforms中的FileField
字段,但是当选择文件时,我会收到以下异常:
File "forms.py", line 15, in check_cover # my forms.py file with custom validator
if field.data:
File "/usr/lib/python3.3/cgi.py", line 637, in __len__
return len(self.keys())
File "/usr/lib/python3.3/cgi.py", line 626, in keys
raise TypeError("not indexable")
验证器代码和表单本身:
def check_cover(form, field):
if field.data: # this line raises exception
filename = field.data.filename
ext = os.path.splitext(filename)[1].strip(".")
if not ext.lower() in ALLOWED_IMG_EXT:
raise validators.ValidationError('Has to be an image')
else:
raise validators.ValidationError('Please, provide an image')
class BlogPostForm(Form):
title = TextField('Title',
validators=[validators.Length(min=1, max=200)])
content = TextAreaField('Content', [validators.Length(min=1)],
id='blog-content')
cover_pic = FileField('Cover image', validators=[check_cover])
并且HTML表单:
<form method="POST" action="save" enctype="multipart/form-data">
{{ form.title }}
{{ form.content }}
{{ form.cover_pic }}
<input type="submit" value="Save" />
</form>
验证器适用于未选择文件的情况,但是一旦我选择了文件,它就在那个检查上失败了。我可以尝试访问filename
,而不仅仅是data
(field.data.filename
),这样做很好,但前提是必须选择一个文件。如果没有选择文件,则会出现AttributeError: 'bytes' object has no attribute 'value'
。所以这很容易理解。
这是否是因为我使用的是Python3?我该如何解决这个问题?
谢谢,
Rapolas
WTForms
的开发人员?这可能与将该库移植到 py3k 有关的错误。 - nsfyn55