热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flask如何使用Bootstrap来美化页面?

本篇接着《Flask极简CRUD操作》继续讲解怎样让页面变得漂亮。在《Flask极简CRUD操作》中,我们实现了基本的CRUD操作,如果运行一下

本篇接着《Flask 极简 CRUD 操作》继续讲解怎样让页面变得漂亮。在《Flask 极简 CRUD 操作》中,我们实现了基本的 CRUD 操作,如果运行一下,我们发现页面长得像这个样子:

我们可以使用 Bootstrap 这个著名的前端框架,让 web 的开发更迅速和简单。回忆一下,我们当时写的 index.html 代码如下:


<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Basic CRUDtitle><link rel&#61;"stylesheet" type&#61;"text/css" href&#61;"../static/styles.css">
head>
<body><a href&#61;"{{ url_for(&#39;notesbp.new_note&#39;) }}">New notea><h4> {{ notes|length }} Notes: h4><table><tr><th>IDth><th>Bodyth><th>Actionth>tr>{% for note in notes %}<tr><td> {{note.id}} td><td> {{note.body}} td><td><a href&#61;"{{ url_for(&#39;notesbp.edit_note&#39;, note_id&#61;note.id) }}">Edita><a href&#61;"{{ url_for(&#39;notesbp.delete_note&#39;, note_id&#61;note.id) }}">Deletea>td>tr>{% endfor %}table>
body>
html>

使用 Bootstrap 美化这个界面需要两步&#xff1a;

  • 页面引用 Bootstrap 依赖文件&#xff08;css, Javascript代码&#xff09;&#xff0c;我们甚至不用下载&#xff0c;直接使用网络上的 CDN 服务。依赖文件见下面的示例
  • 设置 HTML 标签的 class 属性

引用四个依赖文件

<!-- 新 Bootstrap4 核心 CSS 文件 -->
<link rel&#61;"stylesheet" href&#61;"https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css"><!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src&#61;"https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script><!-- popper.min.js 用于弹窗、提示、下拉菜单 -->
<script src&#61;"https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script><!-- 最新的 Bootstrap4 核心 Javascript 文件 -->
<script src&#61;"https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>

国内推荐使用 : https://www.staticfile.org/&#xff0c; 国际推荐使用&#xff1a;https://cdnjs.com/

设置标签的 class 属性

将 index.html 页面中 tablebuttonclass 属性为 Bootstrap 预设类别&#xff0c;瞬间即可美颜。index.html 代码变更如下&#xff1a;


<html lang&#61;"en"><head><meta charset&#61;"UTF-8"><title>Basic CRUDtitle><link rel&#61;"stylesheet" href&#61;"https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css"><script src&#61;"https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js">script><script src&#61;"https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js">script><script src&#61;"https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js">script>
head><body><a class&#61;"btn btn-primary" href&#61;"{{ url_for(&#39;notesbp.new_note&#39;) }}">New notea><table class&#61;"table table-hover"><tr><th>IDth><th>Bodyth><th>Actionth>tr>{% for note in notes %}<tr><td> {{note.id}} td><td> {{note.body}} td><td><a class&#61;"btn btn-primary btn-sm" href&#61;"{{ url_for(&#39;notesbp.edit_note&#39;, note_id&#61;note.id) }}">Edita><a class&#61;"btn btn-primary btn-sm" href&#61;"{{ url_for(&#39;notesbp.delete_note&#39;, note_id&#61;note.id) }}">Deletea>td>tr>{% endfor %}table>
body>html>

再来看看页面&#xff0c;变成了下面的样子&#xff1a;

将引用依赖移入 base.html

Flask 的模版继承让我们从多个页面引用相同的内容变得简单。既然其他页面也要使用这些依赖&#xff0c;我们不妨放在 base.html 文件中。在 templates 文件夹下面新建一个 base.html 文件&#xff0c;编写代码如下&#xff1a;


<html lang&#61;"en"><head><meta charset&#61;"UTF-8"><title>{% block title %}{% endblock %}title><link href&#61;"https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel&#61;"stylesheet"><script src&#61;"https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js">script><script src&#61;"https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js">script>
head><body>{% block body_content %}{% endblock %}
body>html>

base.html 模版文件中定义了一个 body_content 块&#xff0c;其他 html 文件可以从 base.html 文件继承&#xff0c;并且实现 body_content就可以了。将 index.html 进行改造&#xff0c;改造后的文件代码如下&#xff1a;

{% extends &#39;base.html&#39; %} {% block body_content %}<div><a href&#61;"{{ url_for(&#39;notesbp.new_note&#39;) }}" class&#61;"btn btn-primary">New notea>div><table class&#61;"table table-hover"><tr><th>IDth><th>Bodyth><th>Actionth>tr>{% for note in notes %}<tr><td> {{note.id}} td><td> {{note.body}} td><td><a class&#61;"btn btn-primary btn-sm" href&#61;"{{ url_for(&#39;notesbp.edit_note&#39;, note_id&#61;note.id) }}">Edita><a class&#61;"btn btn-primary btn-sm" href&#61;"{{ url_for(&#39;notesbp.delete_note&#39;, note_id&#61;note.id) }}">Deletea>td>tr>{% endfor %}table>
{% endblock %}

此时界面效果与之前完全相同。

使用 Flask-Bootstrap

前面代码我们使用 Bootstrap 框架来美化界面&#xff0c;并没有用到 Flask-Bootstrap。那么 Flask-Bootstrap 的作用又是什么呢&#xff1f;简单的来说&#xff1a;

  • 自动引用 CDN
  • 可以与 WTForm 或其他 Flask 插件比如 Flask-nav 一起使用

安装 Flask-Bootstrap:

pip install flask-bootstrap

关联 Flask app

from flask_bootstrap import Bootstrap
Bootstrap(app)

使用 Flask-Bootstrap 渲染 WTF Form

edit_form.html 为例&#xff0c;之前的代码如下&#xff1a;


<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Edit Notetitle>
head>
<body><h2>Edit Noteh2><form method&#61;"POST">{{ form.body(rows&#61;&#39;10&#39;,cols&#61;&#39;100&#39;) }}<br/>{{ form.submit }}form>
body>
html>

其中 Form 中的字段是通过 WTForm 传入的&#xff0c;对这些字段如何套用 Bootstrap 的样式呢&#xff1f;

  • 引用 Flask-Bootstrap 的 wtf.html 文件

{% import &#39;bootstrap/wtf.html&#39; as wtf %}

  • 调用 wtf.form_field() 表单宏&#xff1a;

{{ wtf.form_field(some_field) }}

经过改写的 edit_form.html 如下&#xff1a;

{% extends &#39;base.html&#39; %}
{% import &#39;bootstrap/wtf.html&#39; as wtf %}{% block body_content %}<h2>Edit Noteh2><form class&#61;"form" method&#61;"POST">{{ wtf.form_field(form.body) }}{{ wtf.form_field(form.submit) }}form>
{% endblock %}

自定义表单样式

对于表单的样式&#xff0c;比如希望输入 body 的时候有多行&#xff0c;有两种定义方法。方法一是在定义 Form 字段的时候&#xff0c;传入一个 render_kw 参数&#xff0c;这个参数为 dict 类型&#xff0c;如下面这样&#xff1a;

class EditNoteForm(Form):body &#61; TextAreaField(&#39;body&#39;, render_kw&#61;{&#39;class&#39;: &#39;text-body&#39;, &#39;rows&#39;: 10, &#39;placeholder&#39;: &#39;输入您的想法...&#39;})submit &#61; SubmitField(&#39;Update&#39;)

方法二是在渲染时控制样式&#xff1a;

{{ wtf.form_field(form.body, , class&#61;"text-body", rows&#61;"10")) }}

本文源码

源码托管在 Github

参考


  • Flask表单&#xff1a;自定义表单样式

推荐阅读
  • JS实现一键分享功能
    本文介绍了如何使用JS实现一键分享功能,并提供了2019独角兽企业招聘Python工程师的标准。同时,给出了分享到QQ空间、新浪微博和人人网的链接。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 在JavaScript中,函数没有重载的概念,如果声明了多个重名的函数,不管函数的形参个数是否一样,只有最后一个有效。如果调用函数时传入的参数个数与函数定义时的参数个数不符,会出现不同的情况。函数调用时,传入的参数个数少于函数定义时的参数个数,未传入的参数会被当做undefined处理,可能会导致错误。而传入的参数个数多于函数定义时的参数个数,多余的参数不会被使用,但不会报错。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
author-avatar
大米的感悟_673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有