FileField в flask_wtf.file не является экземпляром werkzeug.datastructures.FileStorage - PullRequest
0 голосов
/ 16 апреля 2019

Я работаю с формой фляги, в которой есть поле для загрузки изображения. Когда я отправляю форму, атрибут data этого FileField устанавливается на None. Согласно документации на колбу.

FileField, предоставляемый Flask-WTF, отличается от WTForms, предоставляемого поле. Он проверит, что файл является непустым экземпляром FileStorage, иначе данные будут Нет.

Итак, я зарегистрировал свой код для этого isinstance(form.profile_picture, FileStorage), и это возвращает false.

Ниже приведены соответствующие фрагменты кода

Forms.py

from flask_wtf import FlaskForm
from wtforms import PasswordField, StringField, SubmitField, TextAreaField
from wtforms.validators import DataRequired, Email, EqualTo, length
from flask_wtf.file import FileField, FileAllowed

class EditProfileForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    about_me = TextAreaField('About Me', validators=[DataRequired(),
                                                     length(min=10, max=1000)])
    profile_picture = FileField('Profile Picture', validators=[FileAllowed([
        'jpg', 'png'])])
    update = SubmitField('Update')

views.py

@user.route("/edit_profile/", methods=['GET', 'POST'])
def edit_profile():
    form = EditProfileForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=current_user.username).first()
        user.username = form.username.data
        user.about_me = form.about_me.data
        # if form.profile_picture.data: # this returns None
        #     user.profile_pic = process_image(form.profile_picture.data,
        #                                      user.username)
        print(isinstance(form.profile_picture, FileStorage))
        db.session.commit()
        return redirect(url_for("user.profile", uname=current_user.username))
    elif request.method == 'GET':
        form.username.data = current_user.username
        form.about_me.data = current_user.about_me
    return render_template('user/user_edit_profile.html', form=form)

Так я что-то здесь упускаю? Я также прошел этот вопрос Flask-WTF FileField не устанавливает атрибут данных для экземпляра Werkzeug FileStorage , но в моем случае это не было проблемой, поскольку я не инициализировал форму с какими-либо данными.

1 Ответ

0 голосов
/ 17 апреля 2019

Решение этого было довольно простым, я не упомянул правильный тип кодировки в моем form в файле шаблона.

Это решило мою проблему.

<form method='POST' action='' enctype=multipart/form-data>

...