User registration
from flask import Flask, render_template, request, redirect from wtforms import Form from wtforms.fields import core from wtforms.fields import html5 from wtforms.fields import simple from wtforms import validators from wtforms import widgets app = Flask(__name__, template_folder='templates') app.debug = True class RegisterForm(Form): name = simple.StringField( label = ' username ' , validators=[ validators.DataRequired(), validators.Regexp(regex="[a-zA-Z]", message = ' Password at least 8 characters, at least 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character ' ) #Do not use wildcards such as \w, \d in regular expressions. To use [a-zA-z0-9] ], widget=widgets.TextInput(), render_kw={'class': 'form-control'}, default='alex' ) pwd = simple.PasswordField( label = ' password ' , validators=[ validators.DataRequired(message = ' Password cannot be empty. ' ) ], widget=widgets.PasswordInput(), render_kw={'class': 'form-control'} ) pwd_confirm = simple.PasswordField( label = ' duplicate password ' , validators=[ validators.DataRequired(message = ' The duplicate password cannot be empty. ' ), validators.EqualTo( ' pwd ' , message= "The two password inputs are inconsistent " ) ], widget=widgets.PasswordInput(), render_kw={'class': 'form-control'} ) email = html5.EmailField( label = ' mailbox ' , validators=[ validators.DataRequired(message = ' The mailbox cannot be empty. ' ), validators.Email(message = ' Email format error ' ) ], widget=widgets.TextInput(input_type='email'), render_kw={'class': 'form-control'} ) gender = core.RadioField( label = ' gender ' , choices=( ( 1, ' male ' ), ( 2, ' female ' ), ), coerce=int ) city = core.SelectField( label = ' city ' , choices=( ( ' bj ' , ' Beijing ' ), ( ' sh ' , ' Shanghai ' ), ) ) hobby = core.SelectMultipleField( label = ' hobby ' , choices=( ( 1, ' basketball ' ), ( 2, ' football ' ), ), coerce=int ) favor = core.SelectMultipleField( label = ' favorites ' , choices=( ( 1, ' basketball ' ), ( 2, ' football ' ), ), widget=widgets.ListWidget(prefix_label=False), option_widget=widgets.CheckboxInput(), coerce=int, default=[1, 2] ) def __init__(self, *args, **kwargs): super(RegisterForm, self).__init__(*args, **kwargs) self.favor.choices = Query again from database def validate_pwd_confirm(self, field): """ Customize the pwd_confirm field rules, for example: whether it is consistent with the pwd field :param field: :return: """ #At the beginning of initialization, there are already all the values in self.data if field.data != self.data[ ' pwd ' ]: # raise validators.ValidationError("Inconsistent password") # Continue subsequent verification raise validators.StopValidation( " Inconsistent password " ) #Do not continue subsequent verification @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'GET': form = RegisterForm(data={'gender': 1}) return render_template('register.html', form=form) else: form = RegisterForm(formdata= request.form) if form.validate(): print ( ' The data submitted by the user passes the format validation, and the submitted value is: ' , form.data) else : print (form.errors) return render_template( ' register.html ' , form= form) if __name__ == '__main__': app.run() app.py
Two ways to render the page
method one: <p>{{form.name.label}} {{form.name}} {{form.name.errors[0] }}</p> <!--<input type="password" name="pwd">--> <p>{{form.pwd.label}} {{form.pwd}} {{form.pwd.errors[0] }}</p> Method two: {% for item in form %} <p>{{item.label}}: {{item}} {{item.errors[0] }}</p> {% endfor %}