wtform form example

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 %}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325107076&siteId=291194637