ProgrammingError: (psycopg2.ProgrammingError) не может адаптировать тип 'FileStorage' - PullRequest
0 голосов
/ 11 июня 2019

Я просто хочу написать имя файла из данных для моей модели. Как получить имя файла из файлового хранилища?

Я использую Flask для своего веб-приложения. Я создаю форму, которая включает FileField. Для меня важно получить одно и то же имя файла.

Форма:

class TableForm(FlaskForm):
    file = FileField('Add file', validators=[FileAllowed(['xlsx', 'xls', 'csv'])])
    submit = SubmitField('Add file')

Модель:

class Table(db.Model):
    __table_args__= {'schema': 'app'}
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(240), nullable=False)
    table_file = db.Column(db.String(80), nullable=False)

Маршруты:

@app.route("/projects/<int:project_id>", methods=['GET', 'POST'])
@login_required
def project_data_source(project_id):
    tables = Table.query.filter_by(project_id=project_id)
    if project.author != current_user:
        abort(403)
    form = TableForm()
    if form.validate_on_submit():
        table = Table(name=form.file.data, table_file=form.file.data)
        db.session.add(table)
        db.session.commit()
        return redirect(url_for('project_data_source'))

1 Ответ

0 голосов
/ 11 июня 2019

Есть довольно хороший пример их документов .Вот как вы получаете имя файла:

from werkzeug.utils import secure_filename

f = form.file.data
filename = secure_filename(f.filename)

Таким образом, ваш код должен быть:

from werkzeug.utils import secure_filename


@app.route("/projects/<int:project_id>", methods=['GET', 'POST'])
@login_required
def project_data_source(project_id):
    tables = Table.query.filter_by(project_id=project_id)
    if project.author != current_user:
        abort(403)
    form = TableForm()
    if form.validate_on_submit():
        filename = secure_filename(form.file.data.filename)
        table = Table(name=filename, table_file=filename)  # not sure why you save it twice here
        db.session.add(table)
        db.session.commit()
        return redirect(url_for('project_data_source'))
...