Flask中的表单验证

时间:2019-11-14 12:31:00

标签: python flask

这是我登录表格的烧瓶形式。它不喜欢同时需要大学表单字段和电子邮件表单字段的这种验证-我不断收到的错误是

TypeError:validate_university()缺少1个必需的位置参数:“电子邮件”

class RegistrationForm(FlaskForm):
     username = StringField('Username', validators=[DataRequired()])
     password = PasswordField('Password', validators=[DataRequired()])
     password2 = PasswordField(('Repeat Password'), validators=[DataRequired(),EqualTo('password')])
     university = SelectField("What University do you go to?",choices=[("soton","University of Southampton"),("solent","Solent
 Southampton University")])
     email=StringField("What is your university email?",validators=[DataRequired(),Email()])
     submitpassword = SubmitField('Submit your password choice')

     def validate_username(self, username):
         user = User.query.filter_by(username=username.data).first()
         if user is not None:
             raise ValidationError(('Please use a different username.'))

     def validate_university(self,university,email):
         uni = University.query.filter_by(code=university.data).first()
         if not email.data.endswith(uni.emailend):
             raise ValidationError(("Please enter correct university e-mail for the university you attend."))

         user = User.query.filter_by(email=email.data).first()
         if user is not None:
             raise ValidationError(('This e-mail is already in use. Please use a different email address.'))

这是对应的路线python函数:

 @bp.route('/reg1', methods=['GET', 'POST']) 
 def reg1():
     if current_user.is_authenticated:
         return redirect(url_for('main.index'))    
     form = RegistrationForm()
     if form.validate_on_submit():
         user = User(email=form.email.data,username=form.username.data)
         user.set_password(form.password.data)
         db.session.add(user)
         db.session.commit()
         flash('Congratulations, you are now a registered user!')
         return redirect(url_for('auth.reg1'))
     return render_template('auth/test.html', title='Register',
                            form=form,lenform=lenform,postcodes=postcodes)

我该如何解决?为什么不允许我为大学确认书提供两个位置论点? 谢谢

1 个答案:

答案 0 :(得分:1)

必须使用“表单,字段”签名定义常规验证方法,这意味着您不能使用带有(self,university,email)参数的验证器。

但是,您可以通过form参数访问验证器中表单的其他字段:

 def validate_university(form, university):  # <- correct signature
     uni = University.query.filter_by(code=university.data).first()
     email = form.email  # <- access the email field like so
     ....