Ошибка проверки WTForms не работает

Я пытаюсь создать форму входа, в которой, если имя пользователя пусто, выдается ошибка.

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField
from wtforms.validators import InputRequired, Email, length, ValidationError

app = Flask(__name__)
app.config['SECRET_KEY'] = 'This is a secret'
class LoginForm(FlaskForm):
  username = StringField('username', validators=[InputRequired()])
  password = PasswordField('password')

@app.route('/form', methods=['GET','POST'])
def form():
  form=LoginForm()
  return render_template('form.html', form=form)


if __name__== '__main__':
  app.run(debug=True)

HTML-код выглядит следующим образом:

<html>
<title> MY FORM </title>
<body>
<form method="POST" action="{{ url_for('form') }}">
  {{form.csrf_token}}
  {{ form.username.label }}
  {{ form.username }}
  <ul>
  {% for error in form.username.errors %}
    <li style="color: red;">{{ error }} </li>

  {% endfor %}
  </ul>
  {{ form.password }}
  {{ form.password.label }}
  <input type="submit" value="Submit">

</form>
</body>
</html>

По-видимому, цикл for пропускается, и при нажатии кнопки отправки ничего не происходит, пока пользовательское поле равно null.


person Community    schedule 16.11.2017    source источник


Ответы (2)


Предполагая, что ваша форма будет отправлена ​​методом POST, вы должны проверить данные формы, если они были отправлены. С flask-wtf это действительно просто:

@app.route('/form', methods=['GET','POST'])
def check_form():
    form = LoginForm()
    if form.validate_on_submit():
        # do something
        return # something 
    return render_template('form.html', form=form)

Я приглашаю вас узнать больше о flask-wtf

person ploter    schedule 17.11.2017

Вы вообще не проверяете форму в функции form. Отредактируйте функцию и добавьте строку проверки. Именно после проверки обнаруживаются ошибки. В противном случае переменная form в вашем шаблоне не будет иметь атрибутов ошибок. Следует сделать следующее:

@app.route('/form', methods=['GET','POST'])
def form():
    this_form = LoginForm()
    this_form.validate()
    return render_template('form.html', form=this_form)

Кроме того, избегайте называть форму form, поскольку вы уже назвали функцию form. Вы должны изменить либо имя функции, либо имя переменной для формы.

Надеюсь, это поможет.

person Abdou    schedule 16.11.2017