Flask-wtf时Wtforms库的flask框架扩展,能够方便的处理Web表单

一.定义一个web表单

使用flask-wtf时,每个web表单都由一个继承自flask.ext.wtf.Form的类表示,每个字段都由类中的属性表示,每个字段可以附属多个验证函数

from flask.ext.wtf import Form
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired,EqualTo class RegForm(Form):
username = StringField('Username',validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired()])
password1 = PasswordField('confirm password', validators=[DataRequired(),
EqualTo('password', 'password not match')
                                    ])
submit = SubmitField("submit")

这里定义了一个注册用户的表单,password1需要与password填写一样,字段的第一个属性是表单名,在validators中可以使用不同的验证器

二.使用表单

向模版中传入一个表单实例来渲染表单

@app.route('/reg', methods=('GET', 'POST'))
def reg():
form = RegForm()
#验证表单输入内容是否符合要求
if form.validate_on_submit():
#获取表单提交的内容
return "name:%r,password:%r"%(form.username.data,form.password.data)
return render_template('reg.html', form=form)

模版中

 <form action="" method="post" name="login">
{{form.hidden_tag()}}
<p>
Please enter your Name:<br>
{{form.name(size=80)}}<br>
</p>
<p>
Password:<br>
{{ form.password }}
</p>
<p>
Password:<br>
{{ form.password1 }}
</p>
<p>{{ form.submit }}</p>
</form>

form.hidden_tag() 模板参数将被替换为一个隐藏字段,用来是实现在配置中激活的 CSRF 保护。如果你已经激活了 CSRF,这个字段需要出现在你所有的表单中。

Flask-Bootst 提供了快捷的表单显示函数,如可直接使用:

{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf%}
{% block page_content %} {{ wtf.quick_form(form) }} {% endblock %}

三.自定义表单验证

可以自定义表单的验证方式,比如如果数据库已经有了一个用户名就不能再注册同名的用户了,

....
from wtforms import ValidationError
....
class RegForm(Form):
....
#验证username字段时会自动调用这个函数
def validate_username(self,field):
if field.data == 'agmcs':
#抛出的异常提示可作为提示显示
raise ValidationError("the username is already exist")

四.Select控件的使用

class EditProfileAdminForm(Form):
role = SelectField('Role', coerce=int)
#在构造化Form实例时指定selectField的choices内容,
def __init__(self, *args, **kwargs):
super(EditProfileAdminForm, self).__init__( *args,
**kwargs)
self.role.choices = [(role.id, role.name) for role in Role.query.order_by(Role.name).all()]
#choices需要一个列表里面包含数个键值对应的元组 #也可以在初始化后使用form.role.choices = [(role.id, role.name) for role in Role.query.order_by(Role.name).all()] 来添加选项

没有使用Flask-bootstrap的话可以使用如下代码显示:

<div class="form-group" id='cg-{{form.role.id}}'>
{{form.role.label(class='col-lg-2 control-label',for=form.role.id)}}
<div class="col-lg-9">
{{form.role(class='form-control')}}
<span class="help-block" id='hl-{{form.role.id}}'></span>
</div>
</div

五.自定义表单的属性

刚才需要在flask-admin中替换TextArea为CKEDitor,这样就只能在代码中替换,可是ckeditor需要将textarea的class设置成ckedtor,上网查了一下,可以自己定义一个控件属性

明天写//

Flask学习记录之Flask-WTF的更多相关文章

  1. [ZHUAN]Flask学习记录之Flask-SQLAlchemy

    From: http://www.cnblogs.com/agmcs/p/4445583.html 各种查询方式:http://www.360doc.com/content/12/0608/11/93 ...

  2. Flask学习记录之MarkDown编辑文本

    为了让网页支持markdown编辑文本,使用如下了4个库 PageDown : 在前端提供一个可以实时将markdown内容转换成html文本进行效果预览的编辑器 Flask-PageDown: 这个 ...

  3. Flask学习记录之Flask-SQLAlchemy

    Flask-SQLAlchemy库让flask更方便的使用SQLALchemy,是一个强大的关系形数据库框架,既可以使用orm方式操作数据库,也可以使用原始的SQL命令. Flask-Migrate ...

  4. Flask学习记录之Flask-Login

    Flask-Loging 可以方便的管理用户会话,保护路由只让认证用户访问 http://flask-login.readthedocs.org/en/latest/ 一.初始化Flask-Login ...

  5. Flask学习记录之Flask-Admin

    相信用过Django框架的都不会忘记它强大的Admin功能,Flask-admin是一款能够与Django Admin所媲美的扩展,能够快速创建Web管理界面,实现了用户.文件增删改查等常用功能:也可 ...

  6. Flask学习记录之Flask-Migrate

    一.配置Flask-Migrate from flask.ext.migrate import Migrate, MigrateCommand migrate = Migrate(app,db) #第 ...

  7. Flask学习记录之Flask-Moment

    Moment.js 是一个简单易用的轻量级JavaScript日期处理类库,提供了日期格式化.日期解析等功能.它支持在浏览器和NodeJS两种环境中运行.此类库能够 将给定的任意日期转换成多种不同的格 ...

  8. Flask学习记录之Flask-Mail

    Flask-Mail可以连接到配置中的SMTP服务器,进行邮件发送,如果没有进行SMTP服务器的配置,将会默认连接到localhost上的 一.配置及初始化 (1)flask应用配置 #配置选项 MA ...

  9. Flask学习记录之使用Werkzeug散列密码

    数据库中直接存放明文密码是很危险的,Werkzeug库中的security能够方便的实现散列密码的计算 security库中 generate_password_hash(password,metho ...

随机推荐

  1. d3可视化实战01:理解SVG元素特性

    一. SVG简介 ————————————————————————————————————————————————————————————————— SVG是一种和图像分辨率无关的矢量图形格式,它使用 ...

  2. 在同一上机器上建立两个SVN服务

    最快的三步: 1,SVNADMIN CREATE NAME 2, 改写CONF目录下的相关三个文件. 3,重写一个SVN的启动脚本,指定这个SVN不同的目录及端口号. [general] ### Th ...

  3. Summation of primes

    是我算法不对,还是笔记本CPU太差? 我优化了两次,还是花了三四个小时来得到结果. 在输出上加1就是最终结果. The sum of the primes below 10 is 2 + 3 + 5 ...

  4. Cracking the coding interview--Q2.1

    原文: Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow would you solve this p ...

  5. alias, bg, bind, break, builtin, caller, cd, command,

    bash,  :,  .,  [, alias, bg, bind, break, builtin, caller, cd, command,       compgen, complete, com ...

  6. BZOJ3402: [Usaco2009 Open]Hide and Seek 捉迷藏

    3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 51  Solved: 4 ...

  7. Generating SSH Keys [Ubuntu Linux]

    Generating SSH Keys We strongly recommend using an SSH connection when interacting with GitHub. SSH ...

  8. JS浏览器对象-计时器

    setInterval用法 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  9. java.lang.String小测试

    还记得java.lang.String么,如果现在给你一个小程序,你能说出它的结果么 public static String ab(String a){ return a + "b&quo ...

  10. HTML, CSS学习笔记(完整版)

    第一章 div布局 前几课内容 .htm是早期的后缀.由于那时仅仅能支持长度为3的后缀.因此html与htm是一样的. shtml是server先处理然后再交给浏览器处理 #HTML小知识#之#XHT ...