Задать вопрос
@Alex_js

Почему не работают валидаторы wtforms во второй форме на странице?

Хочу добавить на страницу 2 формы flask wtfroms. Для этого создал специальные классы описывающие их.

class UpdateAvatarForm(FlaskForm):
    avatar = FileField('Выберите файл', validators=[FileAllowed(['jpg', 'png', 'jpeg'], 'Только картинки!!'), FileRequired('Файл не выбран') ])
    submit2 = SubmitField('Загрузить')


class AddPostForm(FlaskForm):
    text = TextAreaField('Введите текст поста', validators=[DataRequired(), Length(min=10, max=500, message='Минимум 10, максимум 140 символов')])
    postimg = FileField('Выберите файл', validators=[FileAllowed(['jpg', 'png', 'jpeg'], 'Только картинки!!'), FileRequired('Файл не выбран') ])
    submit1 = SubmitField('Запостить!')


После чего создал 2 экземпляра в функции представления и отрисовал в шаблоне.
Суть первой формы в обновление аватарки, а второй, что бы добавлять посты. Первая форма работает адекватно. А во второй постоянно ругается валидатор, что нет загруженного файла. Даже когда выбираю файл не того формата выдаёт ошибку нет файла.

Функция представления
@app.route('/user/<username>', methods=['POST', 'GET'])
def user(username):
    user = User.query.filter_by(username=username).first_or_404()
    form = AddPostForm()
    form_update_avatar = UpdateAvatarForm()


    if form_update_avatar.submit2.data and form_update_avatar.validate():

        file = form_update_avatar.avatar.data

        file.save(app.root_path + f'/uploads/{file.filename}')
        with open(app.root_path + f'/uploads/{file.filename}', 'rb') as img:
            img = img.read()
        current_user.update_avatar(img)
        db.session.commit()
        return redirect(url_for('user', username=current_user.username))

    if form.submit1.data and form.validate():
        post = Post(body=form.text.data, author=current_user)
        db.session.add(post)
        db.session.commit()
        flash('Пост успешно добавлен', category='success')
        return redirect(url_for('user', username=current_user.username))

    if request.args.get('action') == 'delete':
        if request.args.get('user') and request.args.get('id'):
            if request.args.get('user') == current_user.username:
                post = Post.query.filter_by(id=request.args.get('id')).first_or_404()
                db.session.delete(post)
                db.session.commit()
                return redirect(url_for('user', username=user.username))
            return redirect(url_for('user', username=user.username))
        return redirect(url_for('user', username=user.username))

    return render_template('user.html',
                           form=form,
                           form_update_avatar=form_update_avatar,
                           menu=Menu.query.all(),
                           user=user
                           )
  • Вопрос задан
  • 153 просмотра
Подписаться 1 Средний 6 комментариев
Решения вопроса 1
Wispik
@Wispik
единственное отличие, которое я вижу это то, что у рабочей формы прописано enctype="multipart/form-data", попробуй и у второй формы это написать
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы