wtforms示例

1.wtforms的使用

视图(登录):

from wtforms import Form
from wtforms.fields import simple,core,html5
from wtforms import validators
from wtforms import widgets  # 生成HTML标签的插件

class LoginForm(Form):
    user = simple.StringField(
        validators=[
            validators.DataRequired(message='用户名不能为空.'),
            # validators.Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d')
        ],  # 创建正则,报错时输出message
        widget=widgets.TextInput(),  # 导入html插件
        render_kw={'class': 'form-control'}  # 给标签添加属性

    )
    pwd = simple.PasswordField(
        validators=[
            validators.DataRequired(message='密码不能为空.'),
            # validators.Length(min=8, message='用户名长度必须大于%(min)d'),
            # validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}",
            # message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符')

        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control'}
    )


@account.route('/login',methods=['GET',"POST"])
def login():
    if request.method == 'GET':
        form = LoginForm()  # 实例化一个form对象
        return render_template('login.html', form=form)

    form = LoginForm(formdata=request.form)
	# 如果验证通过form.validate()返回True
    if not form.validate():
        return render_template('login.html', form=form)

    obj = 数据库获取id和name
    if obj:
        session.permanent = True
        session['user_info'] = {'id': obj['id'], 'name': obj['name']}
        return redirect('/index')
    else:
        return render_template('login.html', msg='用户名或密码错误', form=form)

login.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>用户登录</title>
</head>
<body>
    <form method="post">
        {{form.user}} {{form.user.errors[0]}}
        {{form.pwd}} {{form.pwd.errors[0]}}
        <input type="submit" value="提交">{{msg}}
    </form>
</body>
</html>

视图(注册)

class RegisterForm(Form):
    name = simple.StringField(
        label='用户名',  # 标签
        validators=[
            validators.DataRequired()
        ],
        widget=widgets.TextInput(),
        render_kw={'class': 'form-control'},
        default='alex'  # 默认值
    )

    pwd = simple.PasswordField(
        label='密码',
        validators=[
            validators.DataRequired(message='密码不能为空.')
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control'}
    )

    pwd_confirm = simple.PasswordField(
        label='重复密码',
        validators=[
            validators.DataRequired(message='重复密码不能为空.'),
            validators.EqualTo('pwd', message="两次密码输入不一致")
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control'}
    )

    email = html5.EmailField(
        label='邮箱',
        validators=[
            validators.DataRequired(message='邮箱不能为空.'),
            validators.Email(message='邮箱格式错误')
        ],
        widget=widgets.TextInput(input_type='email'),
        render_kw={'class': 'form-control'}
    )

    gender = core.RadioField(
        label='性别',
        choices=(
            (1, '男'),
            (2, '女'),
        ),
        coerce=int  # 类型转换
    )
    city = core.SelectField(
        label='城市',
        choices=SQLHelper.fetch_all('select id,name from city', {}, None),
        # choices=(
        #     (1, '篮球'),
        #     (2, '足球'),
        # ),
        coerce=int
    )

    hobby = core.SelectMultipleField(
        label='爱好',
        choices=(
            (1, '篮球'),
            (2, '足球'),
        ),
        coerce=int
    )

    favor = core.SelectMultipleField(
        label='喜好',
        choices=(
            (1, '篮球'),
            (2, '足球'),
        ),
        widget=widgets.ListWidget(prefix_label=False),
        option_widget=widgets.CheckboxInput(),  # 转换为checkbox类型
        coerce=int,
        default=[1, 2]
    )

    # 一个类,每一次实例化的时候都会执行__init__方法,而类属性中定义的对象会在程序启动的时候实例化一次
    # 因此,如果向数据库中添加内容,需要每一次访问页面的时候都从数据库重新获取一次
    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)
        self.city.choices = 从数据库中查询
	
	# 重写方法,validate_字段名
    def validate_name(self, field):
        """
        自定义pwd_confirm字段规则,例:与pwd字段是否一致
        :param field:
        :return:
        """
        # 最开始初始化时,self.data中已经有所有的值
        # print(field.data) # 当前name传过来的值
        # print(self.data) # 当前传过来的所有的值(包含其他字段):name,gender.....

        obj = 从数据库中查询验证field.data是否存在
        if obj:
        	# 错误信息在form.errors显示
            raise validators.ValidationError("用户名已经存在")  # 继续后续验证
            # raise validators.StopValidation("用户名已经存在")  # 不再继续后续验证


@account.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'GET':
        # 实例化一个RegisterForm对象
        form = RegisterForm()
        return render_template('register.html', form=form)
    form = RegisterForm(formdata=request.form)
    if form.validate():
        print(form.data)  # 输出数据
    else:
        print(form.errors)  # 输出错误信息 
    return "sdfasdfasdf"

register.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>
    <form method="post">
        {% for item in form %}
        <p>{{item.label}}: {{item}} {{item.errors[0] }}</p>
        {% endfor %}
        <input type="submit" value="提交">
    </form>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值