【问题标题】:store file name in column when upload file using FileField wtforms使用 FileField wtforms 上传文件时在列中存储文件名
【发布时间】:2019-04-19 21:54:42
【问题描述】:

我有一个使用以下代码的表,其中包括两列:名称和文件名。我的问题是,当我上传文件时,它的文件名存储在文件名列中。我该怎么做呢? 现在当我上传文件时,文件名中放置了“无”。我只能上传文件或在数据库中输入名称,我认为问题是 enctype="multipart/form-data"。 从 flask_wtf 导入 FlaskForm

from flask_wtf.file import FileField
from wtforms import StringField,SelectField,IntegerField
from wtforms.ext.sqlalchemy.fields import QuerySelectField
from wtforms.validators import DataRequired, Email, Length
class ContactForm(FlaskForm):

    name = IntegerField('name', validators=[Length(min=-1, max=100, message='You cannot have more than 100 characters')])
    filename = FileField()

这是我的 app.py:

def new_contact():
    '''
    Create new contact
    '''
    form = ContactForm()


    if  form.validate_on_submit():


        return render_template('web/new_contact.html',form = form)

        f = form.filename.data
        f.save(os.path.join("./static/upload/", f.filename))
        return redirect(url_for('new_contact'))
        print(f)



        my_contact = Contact()
        form.populate_obj(my_contact)
        db.session.add(my_contact)
        try:
            db.session.commit()
            # User info
            flash('Contact created correctly', 'success')
            return redirect(url_for('contacts'))
        except:
            db.session.rollback()
            flash('Error generating contact.', 'danger')

    return render_template('web/new_contact.html', form=form)

【问题讨论】:

    标签: python flask


    【解决方案1】:

    由于您提供的信息有限,我将尝试实现您想要的功能。

    你的ContactForm 可以保持这样:

    class ContactForm(FlaskForm):
    
        name = IntegerField('File Name', validators=[Length(min=-1, max=100, message='You cannot have more than 100 characters')])
        filename = FileField()
    

    然后你将表单对象传递给模板,从自定义flask路由,我们调用它来解释,联系路由

    @app.route('/contact')
    def contact():
        contact_form = ContactForm()
        return render_template('contact.html'
                                contact_form = contact_form)
    

    在你的模板中,我在这个例子中调用contact.html,你呈现你的表单:

    <form action="" method="post" enctype="multipart/form-data">
        {{ contact_form.csrf_token }}
        {{ contact_form.name }}
        {{ contact_form.filename}}
        <input type="submit"/>
    </form>
    

    在这种形式中,我们希望与action=""在同一条路由上POST数据,即联系路由。所以在这个例子中,我们还应该验证烧瓶应用程序的contact() 方法中的数据。但是您可能想知道enctype="multipart/form-data" 是什么?

    搜索它是什么的第一个结果给了我们结果:

    enctype 属性指定表单数据在提交到服务器时应如何编码。 注意:enctype属性只能在method="post"时使用。

    对于multipart/form-data

    没有字符被编码。当您使用具有文件上传控件的表单时,此值是必需的。

    最后,我们更新烧瓶应用程序联系路线,如下所示:

    @app.route('/contact')
    def contact():
        contact_form = ContactForm()
        if form.validate_on_submit():
            f = contact_form.filename.data
            name = contact_form.name.data
            f.save(os.path.join("./static/contacts/", name))
            redirect(url_for('contact'))
        return render_template('contact.html'
                                contact_form = contact_form)
    

    我们已成功从表单中收集数据,并将文件以静态形式保存在联系人文件夹中,名称来自表单。也许另外我们可以使用werkzeug.utils中的secure_filename

    【讨论】:

    • 谢谢,但是我有一个问题,当我使用 enctype="multipart/form-data' 时,我无法将数据插入数据库,只能上传文件。
    猜你喜欢
    • 2014-08-09
    • 1970-01-01
    • 2013-01-03
    • 2020-03-03
    • 1970-01-01
    • 2021-05-21
    • 2013-06-25
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多