сохранить имя файла в столбце при загрузке файла с помощью FileField wtforms - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть таблица с использованием следующего кода, который включает в себя два столбца: имя и имя файла. Моя проблема заключается в том, что когда я загружаю файл, его имя сохраняется в столбце имени файла. Как мне это сделать? Теперь, когда я загружаю файл, None помещается в имя файла. Я могу только загрузить файл или ввести имя в базу данных, я думаю, что проблема в 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)

1 Ответ

0 голосов
/ 17 ноября 2018

С учетом предоставленной вами ограниченной информации я постараюсь реализовать желаемую функциональность.

Ваш ContactForm может оставаться таким:

class ContactForm(FlaskForm):

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

Затем вы передаете объект формыв шаблон, из пользовательского маршрута фляги, давайте позвоним с целью объяснения, контактный маршрут :

@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)

Мы успешно собрали данные из формы и сохранили файл в папке контактов в статическом виде с именем из формы.Может быть, дополнительно мы могли бы использовать secure_filename из werkzeug.utils.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...