AttributeError:“ NoneType”对象没有针对烧瓶上传的属性“文件名”

时间:2019-04-24 13:27:56

标签: flask flask-wtforms

我正在使用 Flask 1.0.2 Flask-WTF 0.14.2 ,但是我不明白为什么文件名为空。

首先,我像这样创建一个forms.py

#video-list-container

然后我的views.py看起来像这样

images = UploadSet('images', IMAGES)
docs = UploadSet('docs', ['pdf', 'doc', 'docx', 'PDF', 'DOC', 'DOCX', 'jpg', 'jpeg', 'png', 'JPG', 'PNG', 'JPEG'])
configure_uploads(app, (images, docs))
class EvenementForm(FlaskForm):
    titre = StringField(u'titre', validators=[DataRequired()])
    periode = StringField(u'periode', validators=[DataRequired()])
    description = TextAreaField(u'description', validators=[DataRequired()])
    lieu = StringField(u'lieu', validators=[DataRequired()])
    image = FileField(u'image', validators=[FileAllowed(docs, u'Documents seulement. Le poids ne doit pas dépasser les 300 Ko!')])

    def __init__(self, *args, **kwargs):
        super(EvenementForm, self).__init__(*args, **kwargs) 

和我的模板如下所示:

@admin.route('/events', methods=['GET', 'POST'])
def events():
     form = EvenementForm()
     if request.method == 'POST' and form.validate_on_submit():
          evenement = Evenements(titre=form.titre.data, lieu=form.lieu.data, periode=form.periode.data, description=form.description.data)

          otherfile = form.image.data.filename

          if otherfile:
               otherfile = secure_filename(otherfile)
               date = "{:%I%M%S%f%d%m%Y}".format(datetime.now())
               otherfile = date + otherfile
               form.image.data.save(os.path.join(app.config['UPLOAD_FOLDER'], 'resumes/'+otherfile))
               evenement.image = otherfile
          db.session.add(evenement)
          db.session.commit()
          flash('Thanks for adding')
          return redirect(url_for('admin.events'))
     return render_template("admin/events.html", form=form)

我正面临这个错误

  

AttributeError:'NoneType'对象没有属性'filename'

我该如何解决?

2 个答案:

答案 0 :(得分:1)

问题是form.image.data.filename,当用户不提供文件时,将没有filename,因为form.image.data的值将为None

您需要检查form.image.data本身而不是filename

它是这样的:

otherfile = form.image.data
if otherfile:
    # I see your assigning filename to this variable,
    # Next line does the same, I don't recommend it this way
    otherfile = otherfile.filename
    # Do other stuff

WTForms文档中有一个示例用法

您还可以在表单的Class定义上使用FileRequired验证程序,以确保始终存在文件,否则数据将无效

image = FileField(u'image', validators=[FileAllowed(docs, u'Documents seulement. Le poids ne doit pas dépasser les 300 Ko!'), FileRequired()])

答案 1 :(得分:1)

只需将加密类型添加到表单标签中

<form class="col s12"method='POST' enctype="multipart/form-data">