AttributeError: 'NoneType' object has no attribute 'filename' for Flask Uploads
AttributeError: 'NoneType' object has no attribute 'filename' for Flask Uploads
我正在使用 Flask 1.0.2 和 Flask-WTF 0.14.2 但我不明白为什么文件名是空的.
首先我创建一个 forms.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)
然后我的views.py看起来像这样
@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)
我的模板如下所示:
<form action="" method="POST" enctype="multipart/form-data">
<div class="col-lg-12">
{{ form.csrf_token }}
<input type="hidden" class="form-control" name="event_id" value="0" autocomplete="off">
<div class="form-group">
<label for="speaker_name">Titre :</label>
{{ form.titre(placeholder='Entrez le titre de l\'évenement', class='form-control', required='required') }}
<span style="color:red">{% if form.titre.errors %}{{ form.titre.errors[0] }}{% endif %}</span>
</div>
<div class="form-group">
<label for="speaker_job">Lieu:</label>
{{ form.lieu(placeholder='Entrez le lieu de l\'évenement', class='form-control', required='required') }}
<span style="color:red">{% if form.lieu.errors %}{{ form.lieu.errors[0] }}{% endif %}</span>
</div>
<div class="form-group">
<label for="speaker_job">Lieu:</label>
{{ form.periode(placeholder='Entrez la periode de l\'évenement', class='form-control', required='required') }}
<span style="color:red">{% if form.periode.errors %}{{ form.periode.errors[0] }}{% endif %}</span>
</div>
<div class="form-group">
<label for="speaker_job">Lieu:</label>
{{ form.description(placeholder='Entrez la description de l\'évenement', class='textarea textarea-style', required='required') }}
<span style="color:red">{% if form.description.errors %}{{ form.description.errors[0] }}{% endif %}</span>
</div>
<div class="form-group">
<label for="speaker_picture">Image</label>
{{ form.image(placeholder='Entrez l\'image de l\'évenement', class='form-control', required='required') }}
<span style="color:red">{% if form.image.errors %}{{ form.image.errors[0] }}{% endif %}</span>
</div>
<button type="button" class="btn btn-bold btn-pure btn-danger" data-dismiss="modal">
Annuler
</button>
<button type="submit" class="btn btn-bold btn-pure btn-info float-right">
Enregistrer
</button>
</div>
</form>
我遇到了这个错误
AttributeError: 'NoneType' object has no attribute 'filename'
我该如何解决?
问题是 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()])
只需像这样将加密类型添加到表单标签中
<form class="col s12"method='POST' enctype="multipart/form-data">
我正在使用 Flask 1.0.2 和 Flask-WTF 0.14.2 但我不明白为什么文件名是空的.
首先我创建一个 forms.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)
然后我的views.py看起来像这样
@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)
我的模板如下所示:
<form action="" method="POST" enctype="multipart/form-data">
<div class="col-lg-12">
{{ form.csrf_token }}
<input type="hidden" class="form-control" name="event_id" value="0" autocomplete="off">
<div class="form-group">
<label for="speaker_name">Titre :</label>
{{ form.titre(placeholder='Entrez le titre de l\'évenement', class='form-control', required='required') }}
<span style="color:red">{% if form.titre.errors %}{{ form.titre.errors[0] }}{% endif %}</span>
</div>
<div class="form-group">
<label for="speaker_job">Lieu:</label>
{{ form.lieu(placeholder='Entrez le lieu de l\'évenement', class='form-control', required='required') }}
<span style="color:red">{% if form.lieu.errors %}{{ form.lieu.errors[0] }}{% endif %}</span>
</div>
<div class="form-group">
<label for="speaker_job">Lieu:</label>
{{ form.periode(placeholder='Entrez la periode de l\'évenement', class='form-control', required='required') }}
<span style="color:red">{% if form.periode.errors %}{{ form.periode.errors[0] }}{% endif %}</span>
</div>
<div class="form-group">
<label for="speaker_job">Lieu:</label>
{{ form.description(placeholder='Entrez la description de l\'évenement', class='textarea textarea-style', required='required') }}
<span style="color:red">{% if form.description.errors %}{{ form.description.errors[0] }}{% endif %}</span>
</div>
<div class="form-group">
<label for="speaker_picture">Image</label>
{{ form.image(placeholder='Entrez l\'image de l\'évenement', class='form-control', required='required') }}
<span style="color:red">{% if form.image.errors %}{{ form.image.errors[0] }}{% endif %}</span>
</div>
<button type="button" class="btn btn-bold btn-pure btn-danger" data-dismiss="modal">
Annuler
</button>
<button type="submit" class="btn btn-bold btn-pure btn-info float-right">
Enregistrer
</button>
</div>
</form>
我遇到了这个错误
AttributeError: 'NoneType' object has no attribute 'filename'
我该如何解决?
问题是 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()])
只需像这样将加密类型添加到表单标签中
<form class="col s12"method='POST' enctype="multipart/form-data">