Flask-wtforms 无法识别要在 Flask 应用程序中上传的附件
Flask-wtforms doesn't recognize attached file to be uploaded in Flask app
我有一个包含 FileField 的表单,用于上传个人资料图片以及其他一些字段,
我在数据库中将 FileField 配置为不接受 NULL。
当我尝试使用此表单更新数据时,我收到一条错误消息,指出在我选择个人资料图片时图像字段不接受 NULL,但它好像没有识别出我有。
我收到错误
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: employee.image_file
[SQL: UPDATE employee SET ext_no=?, image_file=? WHERE employee.id = ?]
forms.py
class UpdateEmployeeForm(FlaskForm):
first_name = StringField(
"First Name", validators=[DataRequired(), Length(min=1, max=20)]
)
last_name = StringField(
"Last Name", validators=[DataRequired(), Length(min=1, max=20)]
)
picture = FileField(
"Update Profile Picture", validators=[FileAllowed(["jpg", "png"])]
)
submit = SubmitField("Update")
routes.py
@users.route("/employee/<int:employee_id>/update", methods=["GET", "POST"])
@login_required
def update_employee(employee_id):
employee = Employee.query.get_or_404(employee_id)
if employee.organization != current_user:
abort(403)
form = UpdateEmployeeForm()
if form.validate_on_submit():
employee.first_name = form.first_name.data
employee.last_name = form.last_name.data
employee.image_file = form.picture.data
db.session.commit()
flash("Employee data has been updated!", "success")
return redirect(url_for("users.employees"))
elif request.method == "GET":
form.first_name.data = employee.first_name
form.last_name.data = employee.last_name
image_file = url_for("static", filename="profile_pics/" + employee.image_file)
return render_template(
"users/add_employee.html",
title="Update Employee",
form=form,
employee=employee,
image_file=image_file,
)
add_employee.html
<img class="rounded-circle account-img" src="{{ image_file }}">
<div class="form-group">
{{ form.picture.label() }}
{{ form.picture(class="form-control-file") }}
{% if form.picture.errors %}
{% for error in form.picture.errors %}
<span class="text-danger">{{ error }}</span></br>
{% endfor %}
{% endif %}
</div>
我想通了,在 html 文件中添加 enctype="multipart/form-data" 解决了这个问题
<form method="POST" action="" enctype="multipart/form-data">
我有一个包含 FileField 的表单,用于上传个人资料图片以及其他一些字段, 我在数据库中将 FileField 配置为不接受 NULL。 当我尝试使用此表单更新数据时,我收到一条错误消息,指出在我选择个人资料图片时图像字段不接受 NULL,但它好像没有识别出我有。
我收到错误
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: employee.image_file
[SQL: UPDATE employee SET ext_no=?, image_file=? WHERE employee.id = ?]
forms.py
class UpdateEmployeeForm(FlaskForm):
first_name = StringField(
"First Name", validators=[DataRequired(), Length(min=1, max=20)]
)
last_name = StringField(
"Last Name", validators=[DataRequired(), Length(min=1, max=20)]
)
picture = FileField(
"Update Profile Picture", validators=[FileAllowed(["jpg", "png"])]
)
submit = SubmitField("Update")
routes.py
@users.route("/employee/<int:employee_id>/update", methods=["GET", "POST"])
@login_required
def update_employee(employee_id):
employee = Employee.query.get_or_404(employee_id)
if employee.organization != current_user:
abort(403)
form = UpdateEmployeeForm()
if form.validate_on_submit():
employee.first_name = form.first_name.data
employee.last_name = form.last_name.data
employee.image_file = form.picture.data
db.session.commit()
flash("Employee data has been updated!", "success")
return redirect(url_for("users.employees"))
elif request.method == "GET":
form.first_name.data = employee.first_name
form.last_name.data = employee.last_name
image_file = url_for("static", filename="profile_pics/" + employee.image_file)
return render_template(
"users/add_employee.html",
title="Update Employee",
form=form,
employee=employee,
image_file=image_file,
)
add_employee.html
<img class="rounded-circle account-img" src="{{ image_file }}">
<div class="form-group">
{{ form.picture.label() }}
{{ form.picture(class="form-control-file") }}
{% if form.picture.errors %}
{% for error in form.picture.errors %}
<span class="text-danger">{{ error }}</span></br>
{% endfor %}
{% endif %}
</div>
我想通了,在 html 文件中添加 enctype="multipart/form-data" 解决了这个问题
<form method="POST" action="" enctype="multipart/form-data">