wtform не может загрузить файл с формой, содержащей более одного поля - PullRequest
0 голосов
/ 04 февраля 2019

сначала моя модель выглядит следующим образом

    file = db.StringField(db_field = "f", required=True, unique=True)
    file_tn = db.StringField(db_field = "tn")
    descp = db.StringField(db_field="d", max_length=200)
    clr = db.IntField(db_field="cl", choices = COLOR, required=True)    
    prize = db.StringField(db_field="p")
    size = db.IntField(db_field="s", required=True)
    create_date = db.LongField(db_field="c", default=nowms()())
    from_user = db.ReferenceField(User, db_field="fu")

Вы можете угадать правильно!

Я попытался создать форму загрузки с некоторыми деталями, такими как размер, цвет и сохранить их все в базе данных

но проблема в том, что когда я создаю такую ​​форму

class UpLoadForm(Form):
    files = FileField('File', validators=[FileAllowed(['jpg','jpeg','png','gif','pdf']),validators.DataRequired()])

    size = SelectField('Paper\'s size',[validators.DataRequired()], coerce=int)

    color = SelectField('BW or Color', [validators.DataRequired()], choices=[(1,"Color"),
                                                                           (0,"Mono")])

да, это SelectField с динамическим выбором


@core.route('/file/upload', methods=('GET','POST'))
def upload():
    ref = request.referrer
    form = UpLoadForm()

    #get store objects which I stored list of tuples for use in dynamic choices
    #it's look like this [(3,'A3'),(4,'A4')] yeah I'm creating a printing app
    store = Store.objects.filter(storecode='123456').first()    

    #store.pages contained list of tuples
    form.size.choices = store.pages

    #this will get logged in user objects to know who upload it
    logged_user = User.objects.filter(email = session.get('email')).first()


    if form.validate_on_submit():
        assert request.files.get('files') is not None
        if request.files.get('files'):            
            filename = secure_filename(form.files.data.filename)
            filepath = os.path.join(UPLOAD_FOLDER_FILES, filename)
            form.files.data.save(filepath)

            #it won't upload even when I hard code clr and size input(size = 1, clr = 1)
            file = File(
                file = filename,
                clr = form.color.data,
                size = form.size.data,
                from_user = logged_user
            )

            file.save()


Я не знаю, почему это не такt работа

1.файл даже не загружен

2. Ошибка подтверждения отсутствует

3. Ничего не было сохранено в db

, что я пытался

1.создать другую форму, которая отделяет FileField от

результата?это как-то работает

class UpLoadForm(Form):
    files = FileField('File', validators=[FileAllowed(['jpg','jpeg','png','gif','pdf']),validators.DataRequired()])


class FileDetail(Form):
    size = SelectField('Paper\'s size',[validators.DataRequired()], coerce=int)
    color = SelectField('Bw or Color', [validators.DataRequired()], choices=[(1,"Color"),
                                                                           (0,"Mono")])

все почти одинаково, за исключением того, что я просто добавил вторую форму

@core.route('/file/upload', methods=('GET','POST'))
def upload():
    ref = request.referrer
    form = UpLoadForm()

#here is the second form I added
    store = Store.objects.filter(storecode='123456').first()
    form2 = FileDetail()
    form2.size.choices = store.pages

    logged_user = User.objects.filter(email = session.get('email')).first()
    if form.validate_on_submit():
        if request.files.get('files'):
           ###just the same###
            filename = secure_filename(form.files.data.filename)
            filepath = os.path.join(UPLOAD_FOLDER_FILES, filename)
            form.files.data.save(filepath)
           ###################

            file = File(
                file = filename,
                clr = form2.color.data,
                size = form2.size.data,
                from_user = logged_user
            )

            file.save()
        file = None
        if ref:
            return redirect(ref)
        else:
            return redirect(url_for('core.allstore'))
    else:
        return "There is no spoon"

сторона HTML верна, я мог бы показать вам, если вы думаете, что у нее есть чем занятьсяс проблемой (вопрос уже длинный)

это работает на данный момент, но я не знаю, почему это не работает в первую очередь

извините за плохой Eng не стесняйтесь исправлятьвсе или попросить больше информации

...