Найти - Пользователи
Полная версия: Flask + WTForms: проблема с Validation
Начало » Web » Flask + WTForms: проблема с Validation
1 2
ab
Здравствуйте.
Не могу разобраться почему валидаторы всегда возвращают False
То есть всегда переход на error.html

Помогите, пожалуйста)

Python 3.5, Flask==0.12, Flask-WTF==0.14.2, WTForms==2.1

forms.py:
 class SignupForm(Form):
    name = StringField("Ваше имя", [validators.DataRequired("Необходимо ввести имя")])
    email = StringField("Ваш E-mail", [validators.DataRequired("Необходимо ввести  E-mail"),
                                       validators.Email("Необходимо ввести корректный E-mail")])
    password = PasswordField('Создайте пароль', [validators.DataRequired("Необходимо ввести пароль")])
    submit = SubmitField("Создать аккаунт")
    def __init__(self, *args, **kwargs):
        Form.__init__(self, *args, **kwargs)
    def validate(self):
        if not Form.validate(self):
            return False
        user = User.query.filter_by(email=self.email.data.lower()).first()
        if user:
            self.email.errors.append("Этот E-mail уже зарегистрирован в системе")
            return False
        else:
            return True

views.py
 @app.route('/signup', methods=['GET', 'POST'])
def signup():
    form = SignupForm()
    name = form.name.data
    email = form.email.data
    password = form.password.data
    if request.method == 'GET':
        return render_template('signup.html', form=form)
    elif request.method == 'POST' and form.validate():
        return "[1] Create a new user [2] sign in the user [3] redirect to the user's profile"
    else:
        return render_template('error.html', password=password)  #Здесь я проверял что параметры приходят верно
ab
Пробовал в views.py “form = SignupForm(request.form)”, не помогло, работает идентично (параметры из формы передаются в error.html как и без request.form)
FishHook
ab
request.form
фласк я давно не юзал, но вряд ли пост или гет данные достаются из реквеста через такое свойство.
ab
Ок, а почему все же валидатор не валидирует?
Не получает данные?
FishHook
ab
Не получает данные?
Дык вы в форму не передаете данные из реквеста.

 def signup():
    form = SignupForm()
    name = form.name.data
    email = form.email.data
    password = form.password.data

Где это по-вашему происходит? Вы создали объект формы, но значения полей никак не проинициализированы. Две секунды гугления дают такой пример

 def edit_profile(request):
    user = User.objects.get(pk=request.session['userid'])
    form = EditProfileForm(request.POST, obj=user)
    if request.POST and form.validate():
        form.populate_obj(user)
        user.save()
        return redirect('/home')
    return render_to_response('edit_profile.html', form=form)

Вот тут да, тут видно, что форма заполняется данными из POST. А у вас нет.
FishHook
Погодите!
У вас вообще откуда в представлении реквест взялся?
  @app.route('/signup', methods=['GET', 'POST'])
def signup():
    form = SignupForm()
    name = form.name.data
    email = form.email.data
    password = form.password.data
    if request.method == 'GET':     # ЧТО ЗА МАГИЯ?????
ab
FishHook
Погодите!У вас вообще откуда в представлении реквест взялся?

https://code.tutsplus.com/tutorials/intro-to-flask-signing-in-and-out–net-29982
Вот здесь так.
ab
В общем я хз почему то не работало.
Переделал, исходя из примера здесь
plusplus
FishHook
фласк я давно не юзал, но вряд ли пост или гет данные достаются из реквеста через такое свойство.
Именно так и передаются

FishHook
Погодите!
У вас вообще откуда в представлении реквест взялся?

Во flask-е request является глобальным объектом. В любом вью можно импортнуть request и получить данные. Добро пожаловать во Flask:)
plusplus
ab
В общем я хз почему то не работало.
Ну request.form в форму надо обязательно передавать, как вам уже выше написали. Если и с ним не работает, тогда не знаю, видимо форму заполняли с ошибками по запарке.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB