【发布时间】:2014-01-01 20:25:18
【问题描述】:
I'm trying to validate FileField field from wtforms, however, I get the following exception, when file is selected:
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吗?我该如何解决这个问题?
谢谢,
拉波拉斯
【问题讨论】:
-
您联系过
WTForms的人吗?这可能是与将此库移植到 py3k 相关的错误。 -
您可能还想查看此链接diveintopython3.net/special-method-names.html#acts-like-set它描述了
cgi.py的这一部分
标签: python-3.x pyramid wtforms