【问题标题】:Flask Image Field, How to populate image field in update wtform?烧瓶图像字段,如何在更新 wtform 中填充图像字段?
【发布时间】:2020-09-06 09:08:53
【问题描述】:

我有一个应用程序,用户可以在其中添加、更新和删除虚拟助手。为了更新它们,我使用了 populate_obj 方法。它从原始虚拟助手中获取所有字段,例如姓名、姓氏,并以更新形式填充字段,但不填充图像字段。因为该用户必须上传照片,即使他不想更新这一行。例如:用户只想更新姓名,他按下按钮更新,写新姓名,然后按下按钮提交,然后他得到信息“选择照片”,但他不需要写新的姓氏它已填充,我想要与照片相同。我想知道这里有什么解决方案?我的意思是如何填充照片行,以便用户不必每次都选择照片?

型号

class VirtualAssistant(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30))
    last_name = db.Column(db.String(30))
    image_filename = db.Column(db.String)
    image_url = db.Column(db.String)

查看:

@app.route("/update/<int:id>/", methods=["GET", "POST"])
def update_virtual_assistant(id):
    updated_virtual_assistant = VirtualAssistant.query.get_or_404(id)
    form = UpdateVirtualAssistant(obj=updated_virtual_assistant)
    if request.method == "POST":
        if form.validate_on_submit():
            form.populate_obj(updated_virtual_assistant)
            if "photo" in request.files:
                photo = request.files["photo"]
                filename = photos.save(form.photo.data)
                url = photos.url(filename)
                path = "C:\\Users\\Luiza\\VirtualAssistants\\static\\img\\" + filename
                resize_photo(path)
                updated_virtual_assistant.image_url = url
                updated_virtual_assistant.image_filename = filename
            db.session.commit()
            return "the virtual assistant has been updated"
    return render_template("UpdateVirtualAssistant.html", updated_virtual_assistant=updated_virtual_assistant, form=form)

表格:

class AddVirtualAssistant(FlaskForm):
    name = StringField("name", validators=[DataRequired()])
    last_name = StringField("last_name", validators=[DataRequired()])
    photo = FileField("photo", validators=[DataRequired()])

class UpdateVirtualAssistant(AddVirtualAssistant):
    id = IntegerField("id", validators=[DataRequired()])

HTML:

<form method="POST" enctype="multipart/form-data">
    {{ form.csrf_token }}
    {{ form.id }}</br>
    {{ form.name }}</br></br>
    {{ form.last_name }}</br></br>
    {{ form.photo }}</br></br>
    <button type="submit">Update assistant</button>
</form>

【问题讨论】:

    标签: python flask


    【解决方案1】:

    您应该为 UpdateVirtualAssistant() 创建一个单独的类。这样,照片就没有 DataRequired() 验证器,您首先不必担心“选择照片”验证器标志。还可以考虑使用 FileAllowed() 验证器只允许某些文件类型。

    class UpdateVirtualAssistant(FlaskForm):
        id = IntegerField("id", validators=[DataRequired()])
        name = StringField("name", validators=[DataRequired()])
        last_name = StringField("last_name", validators=[DataRequired()])
        photo = FileField("photo", validators=[FileAllowed(['jpg','jpeg','png'])])
    
    

    【讨论】:

    • 嗨,谢谢你的回答,但不幸的是我收到了这个错误“flask_uploads.UploadNotAllowed”我在这里修复了这个错误stackoverflow.com/questions/57316278/…,现在我可以在没有照片的情况下更新,但是当我尝试更新照片时这没用。 :) 嗯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2023-04-03
    • 2020-01-02
    • 1970-01-01
    • 2020-09-11
    相关资源
    最近更新 更多