jinja2是python的模板引擎, 在写python web使用的过程中,macro可以节省大量的代码

比如上一篇的渲染页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="#" method="POST">
{#form要求加上form.csrf_token方脚本跨域攻击#}
{{ form.csrf_token }}
<table border="1">
<tr>
<td>{{ form.username.label }}</td>
<td>{{ form.username }}</td>
{# 如果有错误信息,就遍历出来#}
<td>
{% if form.username.errors %}
{% for error in form.username.errors %}
<li>{{ error }}</li>
{% endfor %}
{% endif %}
</td>
</tr>
<tr>
<td>{{ form.email.label }}</td>
<td>{{ form.email }}</td>
<td>
{% if form.email.errors %}
{% for error in form.email.errors %}
<li>{{ error }}</li>
{% endfor %}
{% endif %}
</td>
</tr>
<tr>
<td>{{ form.password.label }}</td>
<td>{{ form.password }}</td>
<td>
{% if form.password.errors %}
{% for error in form.password.errors %}
<li>{{ error }}</li>
{% endfor %}
{% endif %}
</td>
</tr>
<tr>
<td>{{ form.confirm.label }}</td>
<td>{{ form.confirm }}</td>
<td>
{% if form.confirm.errors %}
{% for error in form.confirm.errors %}
<li>{{ error }}</li>
{% endfor %}
{% endif %}
</td>
</tr>
<tr>
<td></td>
<td>{{ form.accept }}{{ form.accept.label }}</td>
</tr> <tr>
<td></td>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>

用宏实现:新建一个html,用macro 修饰内容(比如大量格式重复,只字段名不重复的内容)

{% macro render_field(field) %}
<tr>
<td>{{ field.label }}</td>
<td>{{ field(**kwargs) }}</td>
<td>
{% if field.errors %}
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
{% endif %}
</td>
</tr>
{% endmacro %}

在页面里面导入,并渲染

{% import 'helper.html' as helper %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="#" method="POST">
{#form要求加上form.csrf_token方脚本跨域攻击#}
{{ form.csrf_token }}
<table border="1">
{{ helper.render_field(form.username) }}
{{ helper.render_field(form.email) }}
{{ helper.render_field(form.password) }}
{{ helper.render_field(form.confirm) }}
{{ helper.render_field(form.accept) }}
<tr>
<td></td>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>

效果一样

测开之路一百四十九:jinja2模板之宏的更多相关文章

  1. 测开之路一百四十八:WTForms表单验证

    使用WTForms表单验证,可以在数据建模时就设置验证信息和错误提示 创建模型时,设置验证内容,如必填.格式.长度 from flask_wtf import Formfrom wtforms imp ...

  2. 测开之路一百四十六:WTForms之表单应用

    WTForms主要是两个功能:1.生成HTML标签  2.对数据格式进行验证 官网:https://wtforms.readthedocs.io/en/stable/ 这篇介绍用wtform生成htm ...

  3. 测开之路一百四十五:SQLAlchemy与后台模板整合之新增、查询、删除

    实现在页面上点击展示页就展示内容,点击新增页就触发新增功能 项目结构 admin.__init__ from flask import Blueprint admin = Blueprint('adm ...

  4. 测开之路一百四十四:ORM之SQLAlchemy查询

    在上一篇的基础上,插入数据 查询 Department.query.all() # 用表对象查db.session.query(Department).all() # 用db对象查 查询前两条,直接p ...

  5. 测开之路一百四十二:ORM框架之SQLAlchemy建库、建表、数据库操作

    flask-SQLAlchemy是在原生SQLAlchemy的基础之上做了一层封装,安装flask-SQLAlchemy会自动安装SQLAlchemy 安装 传统的sql建表建字段 通过flask-S ...

  6. 测开之路一百三十九:会话管理之cookie写入、读取、和更新

    机制:服务器端发送的小段文本信息存储在客户端硬盘 功能:记录用户偏好,请求.页面.站点间共享信息 特点:易丢失.安全隐患 添加cookie,需要用到make_respons.set_cookie @a ...

  7. 测开之路一百二十九:jinja2模板语法

    flask用的是jinja2模板,有自己特定的语法 形参: 在html里面留占位参数: {{ 参数名 }},后端传值时,参数名=参数值 <!DOCTYPE html><html la ...

  8. 测开之路一百五十五:jquery-validation前台数据验证

    前面做的wtform验证是服务器端的验证,需要把数据传输到服务器,服务器验证后再吧结果传输到前端,网络慢的时候,用户体验不好,所以需要前端验证,且后端验证不能少 传统的js或者jquery如果要验证信 ...

  9. 测开之路一百五十四:ajax+json前后台数据交互

    在实际工作中,前后端数据交互大部分都是用的json格式,后端把数据处理完后,把json传给前端,前端再解析 项目结构 models里面加入把数据转为字典的方法 from datetime import ...

随机推荐

  1. ADF检验

    单位根检验是指检验序列中是否存在单位根,因为存在单位根就是非平稳时间序列了.单位根就是指单位根过程,可以证明,序列中存在单位根过程就不平稳,会使回归分析中存在伪回归. from statsmodels ...

  2. 安装与学习laravel

    安装 composer cd /var/www/html curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/ ...

  3. 关于myBatis配置中的一些注意事项

    最近在学习mybatis,在网上查阅资料,并按照别人的范例来测试,总会出一些错误,这里把配置过程中的一些注意事项梳理一下. 一.导包(用eclipse开发) 1.如果你新建的是普通的project,需 ...

  4. C#操作目录和文件

    C#操作目录和文件  创建目录和文件 1.通过Path类的Combine方法可以合并路径. string activeDir = @"C:\myDir"; string newPa ...

  5. php晚了8小时 PHP5中的时间相差8小时的解决办法

    php页面顶部加一句date_default_timezone_set("Asia/Shanghai");或者直接在php.ini设置date.timezone=Asia/Shan ...

  6. CF Round #424 Div.2 D

    n个人拿K个钥匙中的n个然后到办公室(点p) 问最少需要的时间是多少 先排序 如果j<=i 则必须拿这个钥匙 dp[i][j]=max(dp[i-1][j-1],abs(p-b[j])+abs( ...

  7. SQLServer Transaction Isolation Level

    基本用法 -- Syntax for SQL Server and Azure SQL Database SET TRANSACTION ISOLATION LEVEL { READ UNCOMMIT ...

  8. 指数家族-Beta分布

    2. Beta分布 2.1 Beta分布 我们将由几个问题来得引出几个分布: 问题一:1:  2:把这个  个随机变量排序后得到顺序统计量  3:问  是什么分布 首先我们尝试计算  落在一个区间   ...

  9. Softmax函数与交叉熵

    在Logistic regression二分类问题中,我们可以使用sigmoid函数将输入Wx+b映射到(0,1)区间中,从而得到属于某个类别的概率.将这个问题进行泛化,推广到多分类问题中,我们可以使 ...

  10. js 反斜杠 处理

    var t = jsonstr.replace(/\\/g,"\\\\\\\\"); --\\ 表示 代码 输出 \' 单引号 \" 双引号 \& 和号 \\ 反 ...