【Flask之WTForms】 -- 2019-08-08 18:01:54

原文: 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/11322802.html

时间: 2024-11-06 17:29:21

【Flask之WTForms】 -- 2019-08-08 18:01:54的相关文章

【Flask的CBV用法】 -- 2019-08-08 18:01:46

原文: http://106.13.73.98/__/118/ 很简单的,记住用法就行,直接上代码. from flask import Flask, views, request, redirect from flask import flash, get_flashed_messages # 闪现,与CBV无关,如果只想学习CBV,可忽略它 # flash:存数据 get_flashed_messages:取数据 app = Flask(__name__) app.secret_key =

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

原程序员的算法课(1)-算法概述2019年08月18日 17:58:49 十步杀一人_千里不留行 阅读数 11更多所属专栏: 程序员的算法课编辑

[算法之美]数据结构+算法=程序. 前言 数据结构只是静态的描述了数据元素之间的关系.高效的程序需要在数据结构的基础上设计和选择算法. 高效的程序=恰当的数据结构+合适的算法 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一

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

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

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 08 08 字符编码,文件操作

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

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 甲级 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]);