Проверка формы оценивается как ложная колба - PullRequest
0 голосов
/ 09 марта 2019

Моя форма входа очень похожа на это и работает как шарм. Я просто не могу понять, почему form.validate_on_submit() дает False. Как видите, я использую print(form.errors), чтобы увидеть, что там происходит, но все, что я получаю, это пустой словарь, который не очень полезен.

У меня проблема с этой регистрационной формой:

@users.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        form = RegisterView(request.form)
        if form.validate_on_submit():
            user = User(
                first_name=form.first_name.data.title(),
                last_name=form.last_name.data.title(),
                email=form.email.data,
                mobile_number=form.mobile_number.data,
                city=form.city.data.title(),
                country=form.country.data,
                password=User.set_password(form.password.data),
            )
            db.session.add(user)
            db.session.commit()
            flash('Your account has been created. You can now log in.', 'success')
            return redirect(url_for('users.login'))
        else:
            print(form.errors)
    else:
        form = RegisterView()
    return render_template('users/register.html', title='Register User', \
                        form=form)

и это HTML:

<div class='container'>
    <form action='' method='post'>
        {{ form.hidden_tag() }}
        <legend>Register User</legend>
        <fieldset class='form-group'>
            <div class='form-group'>
            {{ form.first_name(class='form-control', placeholder='First Name') }}
            {{ form.last_name(class='form-control', placeholder='Last Name') }}
            {{ form.email(class='form-control', placeholder='@') }}
            {{ form.mobile_number(class='form-control', placeholder='Mobile Number') }}
            {{ form.city(class='form-control', placeholder='City') }}
            {{ form.country(class='form-control') }}
            {{ form.password(class='form-control', placeholder='Password') }}
            {{ form.conf_password(class='form-control', placeholder='Confirm Password') }}
            </div>
        </fieldset>
        <div class='form-group'>
        {{ form.submit(class='btn btn-primary') }}&nbsp;
        <a href='{{ url_for("main.register") }}' id='btn' class='btn btn-warning'>Back</a>
    </div>
</form>

Подробнее:

class Configuration:
    APPLICATION_DIR = os.path.dirname(os.path.realpath(__file__))
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'xyz'
    MAIL_SUBJECT_PREFIX = 'xyz'
    MAIL_SENDER = 'vtc@gmail.com'  # change this to use ProtonMail instead

    @staticmethod
    def init_app(app):
        pass


class DevelopmentConfig(Configuration):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'xyz'

1 Ответ

0 голосов
/ 11 марта 2019

Следует иметь в виду несколько моментов:

  • это регистрационная форма, так почему строка form = RegisterView(request.form)?
  • validate_on_submit несколько эквивалентна request.method == 'POST' and form.validate()поэтому наличие validate_on_submit внутри request.method == 'POST' не имеет особого смысла
  • Не уверен, что уместно, но у вас есть запятая в конце строки password=User.set_password(form.password.data),
  • Я предполагаюvalidate_on_submit неверно из-за токена csfr (тайм-аут / отсутствует), об этом есть сообщения в stackoverflow, хотя я не рекомендую ставить WTF_CSRF_ENABLED = False и забывать об этом

Вот как яD код это вверх:

@users.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterView()
    if form.validate_on_submit():
        user = User(
            first_name=form.first_name.data.title(),
            last_name=form.last_name.data.title(),
            email=form.email.data,
            mobile_number=form.mobile_number.data,
            city=form.city.data.title(),
            country=form.country.data,
            password=User.set_password(form.password.data))
        db.session.add(user)
        db.session.commit()
        flash('Your account has been created. You can now log in.', 'success')
        return redirect(url_for('users.login'))
    return render_template('users/register.html', title='Register User', \
                        form=form)
...