【Flask之WTForms】 -- 2019-08-08 20:39:48

原文: http://106.13.73.98/__/120/

下载:pip install WTForms

第一步 Flask脚本:

from flask import Flask, request, render_template, views
from wtforms import Form, validators
from wtforms.fields import simple, core

app = Flask(__name__)

# --------------------------------------------------------------------------

class RegForm(Form):
    nickname = simple.StringField(
        label="昵称",
        validators=[
            validators.DataRequired(message="昵称不可为空")
        ],
        render_kw={'class': 'my_username'}  # 自定义扩展属性
    )

    password = simple.PasswordField(
        label="密码",
        validators=[
            validators.DataRequired(message="密码不可为空"),
            # validators.Length(min=3, max=9, message="密码最小3位,最大9位"),
            validators.Length(min=6, max=6, message="密码必须为6位"),
            # 支持正则的匹配:
            validators.Regexp(regex='\d+', message="密码必须为纯数字"),
        ]
    )

    repassword = simple.PasswordField(
        label="校验密码",
        validators=[
            validators.EqualTo(fieldname='password', message="密码不一致")
            # 这里将获取password属性的值,并与本属性的值做比较,如果不一致则阻拦
        ]
    )

    # 邮箱
    email = simple.StringField(
        label="邮箱",
        validators=[
            validators.Email(message="邮箱格式错误"),
        ]
    )

    # 单选纽扣??
    gender = core.RadioField(
        label="性别",
        coerce=int,
        choices=((1, "男"), (2, "女"), (3, "密")),
        default=1,  # 性别默认为男
    )

    # 多选框
    hobby = core.SelectMultipleField(
        label="爱好",
        coerce=int,
        choices=((1, 'Python'), (2, 'Flask'), (3, 'Django'), (4, 'Java')),
        default=(1, 2, 3)  # 默认选中
    )

    # 提交按钮
    submit = simple.SubmitField(
        label="提交"
    )

# --------------------------------------------------------------------------

class Reg(views.MethodView):

    def get(self):
        rf = RegForm()  # ??
        return render_template('reg.html', rf=rf)

    def post(self):
        # 校验数据
        rf = RegForm(request.form)
        # 判断是否校验成功
        if rf.validate():
            # 数据存放在rf.data中
            userinfo = rf.data
            return 'Registered successfully.'
        return render_template('reg.html', rf=rf)

# 注册CBV的路由,一个CBV可以有多条路由
app.add_url_rule('/reg', view_func=Reg.as_view('reg'))

app.run(debug=True)

第二步 模版文件:

<form method="post">
    {% for field in rf %}
        <div>{{ field.label }}{{ field }}{{ field.errors.0 }}</div>
        <hr>
    {% endfor %}
</form>

第四步 浏览器:

原文: http://106.13.73.98/__/120/

原文地址:https://www.cnblogs.com/gqy02/p/11323678.html

时间: 2024-11-06 17:36:39

【Flask之WTForms】 -- 2019-08-08 20:39:48的相关文章

2014/08/08 – Backbonejs

[来自: Backbone.js 开发秘笈 第5章] Event API: (function ($) { //define ------------------------- var obj = {}; var obj2 = { commonEvent: function () { window.document.title = new Date().toString(); } }; //扩展对象包含事件 _.extend(obj, Backbone.Events); _.extend(obj

2019/09/08最新进展

今日完成的工作如下: 1.继续完善论文: 2.发现仿真数据出错了,原来是公式有个地方出错了... 修改后的公式为: (1)      当t1<=2.5s,v=v2 (2)      当2.7s > t1 >2.5s,v = v2 – ug(t^2)/0.4|t=t1-2.5 (3)      当t1>2.7s,  v’=v2-ug(0.2*0.2)-(v1/(ug)+0.1-2.7)*ug 3.根据公式进行仿真.写一个cpp: #include<bits/stdc++.h&g

2019.04.08打卡

1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef int DataType; 4 typedef struct node{ 5 DataType data; 6 struct node *next; 7 }LinkNode,*LinkList; //LinkNode是JAVA中链表结点,此类可以存放int.long.float.double.byte.short.String.StringBuffer类型的数据 8 //定义单

2019.10.08考试报告

T1 用一个堆维护最小的是谁,每次加入一个值x时查询堆顶是否小于x,有则买top卖x,之后分为是不是反悔操作判断要不要把pop. 然而好像其他人都push两个来进行反悔操作. 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<queue> 6 #define int long long 7 using namespace

PAT 甲级 A1019 (2019/02/08)

1 #include<cstdio> 2 bool Judge(int A[], int num){ 3 for(int i = 0; i < num; i++){ 4 if(A[i] == A[num-1-i]) 5 return true; 6 else 7 return false; 8 } 9 } 10 int main(){ 11 int N, b, A[40], num = 0; 12 scanf("%d %d", &N, &b); 13

【Flask实例化参数及对app的配置】 -- 2019-08-08 20:39:44

原文: http://106.13.73.98/__/113/ Flask是一个非常灵活且短小精干的Web框架,那么灵活性从什么地方体现呢? 有一个神奇的东西叫做Flask配置,这个东西怎么用呢?它能给我们带来怎么样的方便呢? 首先展示一下: from flask import Flask app = Flask(__name__) app.config['DEBUG'] = True 这句app.config['DEBUG'] = True能实现的功能可就刺激了: 代码只要发生改动,便自动重新

PAT 甲级 A1027 (2019/02/08)

1 #include<cstdio> 2 int main(){ 3 char str[13] = {'0','1','2','3','4','5','6','7','8','9','A','B','C'}; 4 int a, b, c; 5 scanf("%d %d %d", &a, &b, &c); 6 printf("#"); 7 printf("%c%c",str[a/13], str[a%13]);

2019 08 08 字符编码,文件操作

字符编码 一.计算机基础 cpu: 控制程序的运行(从内存中取出文本编辑器的数据读入内存) 内存: 运行程序(经cpu操作后,内存中含有文本编辑器的数据) 硬盘: 存储数据(文本编辑器) 二.文本编辑器存取文件的原理 ? 计算机只认识 0和1 ? 文本编辑器的作用: 读写数据,保存数据 打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后数据丢失. 要想永久保存,需要点击保存按钮:编辑器把内存的数据刷到了硬盘上. 在我们编写一个py文件(没有执行)

2019 08 08 文件高级应用和函数基础

文件的高级应用 可读.可写 r+t: 可读.可写 即可读又可写(尽量不要使用) # r+ 是在后面追加 w+t: 可写.可读 清空文件的功能是w提供的, w+更不要使用 a+t: 可追加.可读 a有追加的功能,a的指针在末尾,a+功能也没用 # wt with open('36w.txt', 'wt', encoding='utf-8') as fw: print(fw.readable()) print(fw.writable()) False True # w+t with open('36