Форма WTF не проверяется - PullRequest
0 голосов
/ 30 апреля 2019

По какой-то причине моя форма wtf, похоже, не проверяется. Когда форма заполнена именем пользователя, которое уже существует, и я нажимаю «Отправить», страница остается на том же месте и не вызывает ошибку проверки, несмотря на то, что она находится в коде. Пользователи с новыми именами добавляются в базу данных просто отлично.

Надеюсь, кто-нибудь сможет скопировать / вставить код в текстовый редактор и запустить его:

Вот форма:

class RegistrationForm(FlaskForm):

    username = StringField('Username', validators = [DataRequired()])
    password = PasswordField('Password', validators = [DataRequired()])
    submit = SubmitField('Register')

    def validate_username(self,field):
        if UserRegistration.query.filter_by(username=field.data).first():
            raise ValidationError('Your username has been registered already!')

Вот класс модели:

class UserRegistration(db.Model, UserMixin):

__tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.Text, unique=True, index=True)
    password_hash = db.Column(db.Text(128))


    def __init__(self, username, password):
        self.username = username
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

    def __repr__(self):
        return f"Username {self.username}"

Вот мнение:

@users.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()

    if form.validate_on_submit():
        username = form.username.data
        password = form.password.data

        user = UserRegistration(username, password)
        db.session.add(user)
        db.session.commit()

        flash(f'Thanks for registering! Your credentials are: Username: {username}, Password: {password}')

        return redirect(url_for('users.all_users'))
    return render_template('register.html', form=form)

Вот HTML-документ, куда отправляется форма:

{% extends 'base.html' %}
{% block content %}

<div class="container col-md-8 col-md-offset-2">
  <h1>Registration Form</h1> <br>

    <form method="POST">
      {{form.hidden_tag()}}

      <div class="form-group">
        {{form.username.label()}}
        {{form.username(class='form-control form-text text-muted')}}
      </div>

      <div class="form-group">
        {{form.password.label()}}
        {{form.password(class='form-control form-text text-muted')}}
      </div>

      <div class="form-group">
        {{form.submit(class="btn btn-primary")}}
      </div>

    </form>
</div>
{% endblock %}

1 Ответ

0 голосов
/ 30 апреля 2019

WTForm встроенные методы валидатора должны использовать следующее соглашение: validate_<field_name>.

В вашем примере интересующие вас поля формы, т. Е. Требующие проверки, следующие: [username, email], поэтому ваши методы проверки должны быть: validate_username(...) и validate_email(...) с уважением. Вместо check_email(...) и check_username(...), что не то, что WTForm ожидает для встроенных валидаторов ...

Попробуйте переименовать ваши методы проверки , чтобы они соответствовали встроенной спецификации WTForm, что-то вроде:

def validate_email(self,field):
    # check is none for that user email!
    if UserRegistration.query.filter_by(email=field.data).first():
        raise ValidationError('Your email has been registered already!')

def validate_username(self,field):
    if UserRegistration.query.filter_by(username=field.data).first():
        raise ValidationError('Your username has been registered already!')

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

...