前言 前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法。
控制语句 和python语言一样,模板语言也有自己的控制语句,比如条件语句、循环语句等等;
条件语句if 1 2 3 4 5 6 7 {% if name and name == 'admin' %} <h1>This is admin console</h1> {% elif name %} <h1>Welcome {{ name }}!</h1> {% else %} <h1>Please login</h1> {% endif %}
循环语句for 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 基本的for循环结构 {% for user in users %} <li>{{ user.username|e }}</li> {% endfor %} # 当for循环没有执行时使用else中代替 {% for user in users %} <li>{{ user.username|e }}</li> {% else %} <li><em>no users found</em></li> {% endfor %} # 去除空白,加-,注意%和-必须紧靠,否则无效; {% for digit in digits -%} {{ digit }} {%- endfor %}
注意 :访问每次循环中的数据使用loop变量代表本次的循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 {% for user in users %} <li>{{ user.username|e }}</li> {% if loop .index == 2 %} <p>OK</p> {% endif %} {% endfor %} loop .index 当前循环迭代的计数(从 1 开始)loop .index0 当前循环迭代的次数(从 0 开始)loop .revindex 到循环结束需要迭代的次数(从 1 开始)loop .revindex0 到循环结束需要迭代的次数(从 0 开始)loop .first 如果是第一次迭代,为 True 。loop .last 如果是最后一次迭代,为 True 。loop .length 序列中的元素的个数,即循环的长度;loop .cycle 在一串序列间期取值的辅助函数。loop .depth 当前循环在递归中的层级(从1 开始)loop .depth0 当前循环在递归中的层级(从0 开始)
作用域控制with 1 2 3 4 5 6 7 8 9 10 11 # 限制对象的作用域,foo作为局部变量 {% with foo = 1 %} {% set bar = 2 %} {{ foo + bar }} {% endwith %} # do可以将表达式转换语句,即表示执行的意思 {% with arr = ['Sunny'] %} {% do arr.append('Rainy') %} # 执行arr.append('Rainy')语句 {{ arr }} {% endwith %}
表达式
1 2 # 其语法和python中的一模一样 {{ a + b}}
1 2 # 其语法和python中的一模一样 {{ a == b}}
1 2 {{ "Hello " ~ name ~ "!" }} 返回(假设 name 值为 'John' ) Hello John!
转义
1 2 3 4 5 6 7 8 # {{}} 和{%%}这种形式将失效,代表它们本身的符号 {% raw %} <ul> {% for item in items %} <li>{{ item }}</li> {% endfor %} </ul> {% endraw %}
1 2 3 4 # autoescape参数,如果为false则关闭转义,flask框架中默认为True {% autoescape false %} <h1>Hello {{ name }}!</h1> {% endautoescape %}
模板继承 1 2 3 4 5 6 7 8 9 10 11 12 # test.html # 父模板 {% block head %} {% endblock %} # 子模板 {% extends "test.html" %} {% block head %} {{ super() }} Index {% endblock %}
注意: 继承之后,块内是无法访问块外的变量的,如果想要访问,则:
1 2 # scoped参数可以让list块内访问块外的变量 {% block list scoped %} {% endblock %}
包含include include可以加载另一个模板在当前的位置,直接渲染;
1 2 3 4 5 6 7 8 <body> {% include 'footer.html' %} </body> {% include 'footer.html' ignore missing %} {% include ['footer.html' ,'bottom.html' ,'end.html' ] ignore missing %}
宏
1 2 3 4 5 # 使用macro定义,相当于def {% macro input(name, type='text', value='') -%} <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> {%- endmacro %}
1 2 3 4 5 6 7 8 9 10 11 12 # 通过表达式调用 <p>{{ input('username', value='user') }}</p> <p>{{ input('password', 'password') }}</p> # 使用call,会将里面的内容替换func函数中的caller()方法 {% call func(users) %} <td><input name="delete" type="button" value="Delete"></td> {% endcall %} # 调用宏的参数,func函数中的caller(name)方法的参数name可以传递过来 {% call(name) func(users) %} <td><input name="delete" type="button" value="Delete"></td> {% endcall %}
宏里面自动添加了varargs和kwargs参数,可以用来接收多余的变量或键值对参数;
一个宏可以被不同的模板使用,建议将其声明在一个单独的模板文件中。需要使用时导入进来即可,而导入的方法也非常类似于Python中的”import”。
1 2 {% import 'form.html' as form %} <p>{{ form.input('username', value='user') }}</p>
参考: