колба wtforms остается пустой после отправки

#flask #flask-login

Вопрос:

Мой код таков : routes.py:

 @app.route('/login', methods=['GET', 'POST'])
def login():

    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()  # None if invalid
        if user is None or not user.check_password(form.password.data):
            flash('Invalid username or password')
            return redirect(url_for('login'))

        login_user(user, remember=form.remember_me.data)
        return redirect('dashapp')

    print(form.errors)
    return render_template('login.html', form=form)
 

login.html

 {% extends "base.html" %}
{% import 'bootstrap/wtf.html' as wtf %}

{% block app_content %}
    <h3>Log in</h3>
    <div class="row">
    <form>
        <div class="col-md-4">

            {{ wtf.quick_form(form) }}
        </div>
    </form>
    </div>
{% endblock %}
 

models.py:

 @login_manager.user_loader
def load_user(user_id):
    return User.query.get(user_id)

class User(UserMixin, db.Model):
    
    id = Column(Integer, primary_key=True)
    username = Column(String(64), index=True, unique=True)
    email = Column(String(120), index=True, unique=True)
    password_hash = Column(String(128))
    is_admin = Column(Boolean, default=False)


    def set_password(self, password):

        self.password_hash = generate_password_hash(password)

    def check_password(self, password):

        return check_password_hash(self.password_hash, password)
 

при отправке моя форма все еще пуста, поэтому она не прошла form.validate_on_submit().
Я попытался упростить, как вы можете видеть мой код, но он все еще не работает

объект данных формы-имя пользователя:нет, пароль:нет, Отправить:Ложь. Токен CSFR не пуст, так что проблема не в этом.

Пожалуйста, найдите мою форму:

 class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = StringField('Password', validators=[DataRequired()])
    remember_me = BooleanField('Remember Me')
    submit = SubmitField('Log In')
 

Комментарии:

1. Добавьте также определение вашей формы, чтобы мы могли видеть всю картинку

2. Не работал с quick_form, но я вижу, что вы не должны помещать его в тег <форма>. Может быть, у вас на странице есть две формы

3. @Дмитрий был прав, вам следует удалить <form> тег, посмотрите этот пост на Medium betterprogramming.pub/как использовать-колбу-wtforms-faab71d5a034

4. это работает . Спасибо

Ответ №1:

мое исправление, удаляющее тег формы: спасибо @Dimitry и @cizario

 {% extends "base.html" %}
{% import 'bootstrap/wtf.html' as wtf %}

{% block app_content %}
    <h3>Log in</h3>
    <div class="row">

        <div class="col-md-4">

            {{ wtf.quick_form(form) }}
        </div>

    </div>
{% endblock %}