Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flask 属性错误:';非类型';对象没有属性';文件名';用于烧瓶上载_Flask_Flask Wtforms - Fatal编程技术网

Flask 属性错误:';非类型';对象没有属性';文件名';用于烧瓶上载

Flask 属性错误:';非类型';对象没有属性';文件名';用于烧瓶上载,flask,flask-wtforms,Flask,Flask Wtforms,我使用的是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, (ima

我使用的是Flask 1.0.2Flask 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) 
@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 class="col s12"method='POST' enctype="multipart/form-data">
那么我的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&eacute;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)
<form class="col s12"method='POST' enctype="multipart/form-data">
我的模板如下所示:

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

{{form.csrf_token}
滴度:
{{form.titre(占位符='Entrez le titre de l\'venement',class='form-control',required='required')}
{%if-form.titre.errors%}{{form.titre.errors[0]}{%endif%}
代替:
{{form.liue(占位符='Entrez le liue de l\'ve',class='form-control',required='required')}
{%if-form.liue.errors%}{{form.liue.errors[0]}{%endif%}
代替:
{{form.periode(占位符='Entrez la periode de l\'ve',class='form-control',required='required')}
{%if-form.periode.errors%}{{form.periode.errors[0]}{%endif%}
代替:
{form.description(占位符='Entrez la description de l\'évenement',class='textarea textarea style',required='required')}
{%if-form.description.errors%}{{form.description.errors[0]}{%endif%}
形象
{{form.image(占位符='Entrez l'image de l\'venement',class='form-control',required='required')}
{%if-form.image.errors%}{{form.image.errors[0]}{%endif%}
环空器
登记员
我面临着这个错误

AttributeError:“非类型”对象没有属性“文件名”


如何解决它?

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

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

事情是这样的:

otherfile=form.image.data
如果是其他文件:
#我看到您将文件名分配给此变量,
#下一行也一样,我不推荐这样做
otherfile=otherfile.filename
#做其他事情
WTForms文档中有一个示例用法

您还可以在表单的类定义上使用validator来确保始终存在一个文件,否则数据将无效

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

只需将加密类型添加到表单标记中,如下所示

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&eacute;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)
<form class="col s12"method='POST' enctype="multipart/form-data">