bootstrap与表单

Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript 开发的简洁、直观、强悍的前端开发框架,使得 Web 开发更加快捷. Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的BreakingNews都使用了该项目。国内一些移动开发者较为熟悉的框架,如WeX5前端开源框架等,也是基于Bootstrap源码进行性能优化而来。

flask-boostrap

  • 说明:在flask中使用bootstrap,可以通过该扩展库完成。

  • 安装:pip install flask-bootstrap

  • 使用:

    from flask_bootstrap import Bootstrap
    
    bootstrap = Bootstrap(app)
  • 模板

    {# 继承自bootstrap基础模板 #}
    {% extends 'bootstrap/base.html' %} {% block title %}标题{% endblock %} {% block content %}
    <div class="container">默认内容</div>
    {% endblock %}
  • bootstrap基础模板中的block

    block 说明
    doc 整个HTML文档
    html 整个html标签
    head 整个head标签
    metas 一组meta标签
    styles 一组link标签
    body 整个body标签
    navbar 导航条
    content 页面内容
    scripts 一组scripts标签

    提示:当重写一个block后,原来的显示效果全没了,很可能是因为没有写{{ super() }}

加载静态资源

  • flask中静态资源默认存放在static目录下,因此目录结构如下:

    project/        # 项目目录
    manage.py # 启动控制文件
    templates/ # 模板文件目录
    static/ # 静态资源目录
    img/ # 图片
    css/ # css文件
    js/ # js文件
    favicon.ico # 收藏夹图标
  • 加载静态资源文件

    {# 继承自自定义的基础模板 #}
    {% extends 'base.html' %} {% block title %}用户登录{% endblock %} {% block page_content %}
    <h1>欢迎登录...</h1>
    <div class="test"></div>
    {# 加载图片资源 #}
    {# 静态资源加载的目录static,提前在img文件夹保存一个图片xxx.jpg #}
    <img width="300" src="{{ url_for('static', filename='img/xxx.jpg') }}">
    {% endblock %} {% block styles %}
    {{ super() }}
    {# 加载CSS文件:css文件可以从bootstrap中粘贴一个过来 #}
    <link href="{{ url_for('static', filename='css/common.css') }}" type="text/css" rel="stylesheet" />
    {% endblock %} {% block head %}
    {{ super() }}
    {# 加载网站收藏夹小图标:ico文件自行从百度下载一个ico文件 #}
    <link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}" />
    {% endblock %} {% block scripts %}
    {{ super() }}
    {# 加载JS文件:js文件可以从bootstrap中粘贴一个过来 #}
    <script type="text/javascript" src="{{ url_for('static', filename='js/common.js') }}"></script>
    {% endblock %}

原生表单

  • 准备模板文件

    <form method="get" action="{{ url_for('check') }}">
    用户名:<input name="username" /><br />
    <input type="submit" />
    </form>
  • 添加视图函数,渲染模板文件

    @app.route('/login/')
    def login():
    return render_template('login.html')
  • 校验提交的请求

    @app.route('/check/', methods=['GET', 'POST'])
    def check():
    # args:所有的GET参数
    # return request.args.get('username', '提交失败')
    # form:所有的POST参数
    # return request.form.get('username', '提交失败')
    # values:所有的GET/POST参数
    return request.values.get('username', '提交失败')
  • 一个路由可以接收多种请求

    @app.route('/login/', methods=['GET', 'POST'])
    def login():
    if request.method == 'POST':
    return request.form.get('username', '登录失败')
    return render_template('login.html')

flask-wtf

  • 说明:表单处理的扩展库,提供了CSRF、字段校验等实用功能,实用非常方便。

  • 安装:pip install flask-wtf

  • 使用:

    • 创建表单类:
    # 导入表单类的基类
    from flask_wtf import FlaskForm
    # 导入字段类型
    from wtforms import StringField, SubmitField
    # 导入相关验证器
    from wtforms.validators import Length # 创建表单类
    class NameForm(FlaskForm):
    # name = StringField('用户名')
    # submit = SubmitField('提交')
    name = StringField('用户名', validators=[Length(3, 6, message='用户名必须是3~6个字符')])
    submit = SubmitField('提交')
    • 添加视图函数,创建表单对象,并分配的模板中
      @app.route('/', methods=['GET', 'POST'])
    def index():
    # 创建表单对象
    form = NameForm()
    # 判断是否是有效的提交
    if form.validate_on_submit():
    return form.name.data
    # 在模板文件中渲染表单,form.html可以自己写一个,也可以百度一个
    return render_template('form.html', form=form)
  • 原生渲染表单

    {# 原生渲染 #}
    <form method="post">
    {# CSRF字段 #}
    {{ form.hidden_tag() }}
    {# name字段 #}
    {{ form.name.label() }}{{ form.name(id='xx', class='yy') }}
    {% for e in form.name.errors %}
    <div>{{ e }}</div>
    {% endfor %}
    {# 提交按钮 #}
    {{ form.submit() }}
    </form>
  • 使用bootstrap进行渲染

    {% extends 'bootstrap/base.html' %}
    
    {# 导入快速渲染表单的宏 #}
    {% from 'bootstrap/wtf.html' import quick_form %} {% block title %}bootstrap渲染表单类{% endblock %} {% block content %}
    <div class="container">
    {# 在合适的位置渲染表单 #}
    {{ quick_form(form) }}
    </div>
    {% endblock %}
  • POST重定向到GET:浏览器会记录最后的请求状态,若最后请求时POST,点击刷新时会提示再次提交表单。

    @app.route('/', methods=['GET', 'POST'])
    def index():
    # 创建表单对象
    form = NameForm()
    # 判断是否是有效的提交
    if form.validate_on_submit():
    session['name'] = form.name.data
    return redirect(url_for('index'))
    name = session.get('name')
    # 在模板文件中渲染表单
    return render_template('form2.html', form=form, name=name)
  • 常见字段类型:请自行测试

    字段类型 说明
    StringField 普通文本
    SubmitField 提交按钮
    PasswordField 密文文本
    HiddenField 隐藏字段
    RadioField 单选框
    BooleanField 复选框
    SelectField 下拉框
    FileField 文件上传
    TextAreaField 文本域
    IntegerField 文本字段,值为整数
    FloatField 文本字段,值为浮点数
    DateField datetime.date类型
    DateTimeField datetime.datetime类型
  • 常见验证器:请自行测试

    验证器 说明
    Length 规定字符长度
    DataRequired 确保字段有值(提示信息与所写的不一致)
    Email 邮箱格式
    IPAddress IP地址
    NumberRange 数值的范围
    URL 统一资源定位符格式
    EqualTo 验证两个字段的一致性
    Regexp 正则校验
  • 自定义字段验证函数

    # 创建表单类
    class NameForm(FlaskForm):
    。。。
    # 字段校验函数:'validate_字段名'
    def validate_name(self, field):
    if len(field.data) < 6:
    raise ValidationError('用户名不能少于6个字符')

消息闪烁

  • 说明:

    当用户发出请求后,状态发生了改变,需要系统给出警告提示等信息时,通常都是弹出一条消息,指示用户下一步的操作,用户可以手动关闭或自动消失,整个过程不会影响页面的正常显示。

  • 使用:

    • 在需要闪烁消息时,使用flash函数保存闪烁消息
    @app.route('/', methods=['GET', 'POST'])
    def index():
    # 创建表单对象
    form = NameForm()
    # 判断是否是有效的提交
    if form.validate_on_submit():
    # 最后一次提交的名字
    last_name = session.get('name')
    # 如果存在最后提交的名字,且最后提交的名字与之前保存的名字不相同时
    if last_name and last_name != form.name.data:
    flash('大哥,又换名字了^_^')
    session['name'] = form.name.data
    return redirect(url_for('index'))
    name = session.get('name')
    # 在模板文件中渲染表单
    return render_template('form2.html', form=form, name=name)
    • 在模板文件中提供get_flashed_messages函数获取闪烁消息并渲染:
    {% for message in get_flashed_messages() %}
    {# 闪烁消息文件可以从bootstrap中粘贴一个过来 #}
    <div class="alert alert-warning alert-dismissible" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span>
    </button>
    {{ message }}
    </div>
    {% endfor %}

    说明:上面是从bootstrap粘贴的可消失的警告框。

flask-moment

  • 说明:专门负责数据本地化显示的扩展库,使用非常方便。

  • 安装:pip install flask-moment

  • 使用:

    • python代码:
    from flask_moment import Moment
    
    moment = Moment(app)
    
    @app.route('/moment/')
    def mom():
    from datetime import datetime, timedelta
    current_time = datetime.utcnow() + timedelta(seconds=-360)
    return render_template('mom.html', current_time=current_time)
    • 模板文件:
    {# 加载jQuery:依赖 #}
    {{ moment.include_jquery() }} {# 加载moment #}
    {{ moment.include_moment() }} {# 设置语言 #}
    {{ moment.locale('zh-CN') }} {# 简单的格式化时间显示 #}
    <div>时间:{{ moment(current_time).format('LLLL') }}</div>
    <div>时间:{{ moment(current_time).format('LLL') }}</div>
    <div>时间:{{ moment(current_time).format('LL') }}</div>
    <div>时间:{{ moment(current_time).format('L') }}</div> {# 自定义格式化时间显示:如2018-05-20 01:03:14 #}
    <div>自定义:{{ moment(current_time).format('YYYY-MM-DD HH:mm:ss') }}</div> {# 显示时间差 #}
    <div>发表于:{{ moment(current_time).fromNow() }}</div>

Flask—03-bootstrap与表单的更多相关文章

  1. Bootstrap之表单控件状态

    Bootstrap中的表单控件状态主要有三种:焦点状态,禁用状态,验证状态.   一.焦点状态:该状态告诉用户可输入或选择东西 焦点状态通过伪类“:focus”以实现. bootstrap.css相应 ...

  2. BootStrap 智能表单系列 首页 (持续更新中...)

    背景:本码农.NET后端工程师,在项目开发中发现写了很多重复的代码, 于是自己整了一套根据配置来生成form表单的插件,针对表单的改动仅需要修改配置的json即可 使用中发现还是蛮实用的,于是开源出来 ...

  3. BootStrap 智能表单系列 十一 级联下拉的支持

    像省市县选择的这种,但凡是个人肯定都见过,实现方式有很多种 1.有在第一级选择的时候去加载或者从本地对象中拿第一级对应的数据源显示到列表中,第二级以此类推 2.也有将所有的项都加载到select中,然 ...

  4. BootStrap 智能表单系列 十 自动完成组件的支持

    web开发中,肯定遇到像百度.google这种搜索的功能吧,那智能表单中的自动完成可以做什么呢,下面来揭晓: 1.包含像google.百度等类似的简单搜索 2.复杂结构的支持,比如说 输入产品编号,需 ...

  5. BootStrap 智能表单系列 九 表单图片上传的支持

    本章介绍如何在生成表单后,可以支持上传图片后可以及时预览图片 代码如下(连接地址:https://github.com/xiexingen/Bootstrap-SmartForm/blob/maste ...

  6. BootStrap 智能表单系列 六 表单数据绑定(编辑页面的数据绑定)

    本章介绍如何在生成表单后,将一个model的数据展示到form表单中(一般用于编辑页面) 代码如下(连接地址:https://github.com/xiexingen/Bootstrap-SmartF ...

  7. BootStrap 智能表单系列 八 表单配置json详解

    本章属于该系列的高级部分,将介绍表单中一些列的配置 1.config列的配置: 主要用于控制布局 :config:{autoLayout:true|'1,2,2,4'} true:根据配置项最里层的数 ...

  8. BootStrap 智能表单系列 七 验证的支持

    但凡是涉及到用户编辑信息然后保存的页面,都涉及到一个数据是否符合要求的检查,需要客服端和服务器端的校验的问题: 客服端的校验主要是为了提高用户体验,而服务器端的校验为了数据的合格性 该插件也为您支持到 ...

  9. BootStrap 智能表单系列 五 表单依赖插件处理

    这一章比较简单哦,主要就是生产表单元素后的一些后续处理操作,比如日期插件的渲染.一些autocomplete的处理等,在回调里面处理就可以了, demo: $("input.date-pic ...

  10. BootStrap 智能表单系列 四 表单布局介绍

    表单的布局分为自动布局和自定义布局两种: 自动布局就是根据配置项中第二级配置项中数组的长度来自动使用不同的bootstrap栅格,通过设置autoLayout为true可以实现自动布局 自动以布局就是 ...

随机推荐

  1. Javascript模块化编程(一)模块的写法最佳实践六、输入全局变量 独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。 为了在模块内部调用全局变量,必须显式地将其他变量输入模块。

    Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类clas ...

  2. 深入理解JavaScript系列(9):根本没有“JSON对象”这回事!

    前言 写这篇文章的目的是经常看到开发人员说:把字符串转化为JSON对象,把JSON对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下,供大家讨论,如有错误,请大家指出,多谢. ...

  3. [转]ASP.NET Core Exception Filters and Resource Filters

    本文转自:https://damienbod.com/2015/09/30/asp-net-5-exception-filters-and-resource-filters/ This article ...

  4. Linux防火墙命令

    linux 查看防火墙状态   1.查看防火墙状态 systemctl status firewalld firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning ...

  5. hibernate事务管理 (jdbc jta)

    hibernate的两种事务管理jdbc 和jta方式.下边说说两者的区别一.说明一下jdbc和jta方式事务管理的区别:JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBC ...

  6. textarea高度随着内容的多少而变化,高度可以删减

    问题:可以多行输入,并且输入框的高度随着内容的多少而变化,输入框的高度不能只增不减 由于 input 只能单行输入 textarea可以多行输入,并且高度可以随着内容的增加而增加,但是当内容删减的时候 ...

  7. javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

    赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...

  8. Java NIO(三) Buffer

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

  9. 【网络编程】Socket套接字网络编程模型

    一.Linux网络模型 -- Socket套接字编程 图片:Socket 抽象层 Socket编程--不同协议,统一接口 Socket的实质就是一个接口, 利用该接口,用户在使用不同的网络协议时,操作 ...

  10. 多线程(八)~ThreadLocal、InheritableThreadLocal的使用

    通过前面的学习,我们了解了在多线程+成员变量等情况下会出现线程安全的问题.那么解决线程安全问题除了使用synchronize关键字之外,还有另一种常用的解决思路,那就是使用ThreadLocal类,下 ...