• 凉风有兴,秋月无边, 亏我思娇的情绪好比度日如年。
  • 虽然我不是玉树临风,潇洒倜傥, 可是我有我广阔的胸襟,加强健的臂腕!

flask基础之jijia2模板语言进阶(三)

网站推广 villain 6个月前 (12-29) 189次浏览 已收录 0个评论

前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法。

flask基础之安装和使用入门(一)

flask基础之jijia2模板使用基础(二)

和python语言一样,模板语言也有自己的控制语句,比如条件语句、循环语句等等;

条件语句if

{% if name and name == 'admin' %}
 h1 This is admin console /h1 
{% elif name %}
 h1 Welcome {{ name }}! /h1 
{% else %}
 h1 Please login /h1 
{% endif %}

循环语句for

# 基本的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变量代表本次的循环

{% 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

# 限制对象的作用域,foo作为局部变量
{% with foo = 1 %}
 {% set bar = 2 %}
 {{ foo + bar }}
{% endwith %}
# do可以将表达式转换语句,即表示执行的意思
{% with arr = ['Sunny'] %}
 {% do arr.append('Rainy') %} # 执行arr.append('Rainy')语句
 {{ arr }}
{% endwith %}

算术表达式

# 其语法和python中的一模一样
{{ a + b}}

比较表达式

# 其语法和python中的一模一样
{{ a == b}}
{{ "Hello " ~ name ~ "!" }} 
返回(假设 name 值为 'John' ) Hello John! 

raw忽略模板的语法

# {{}} 和{%%}这种形式将失效,代表它们本身的符号
{% raw %}
 {% for item in items %}
 li {{ item }} /li 
 {% endfor %}
 /ul 
{% endraw %}
# autoescape参数,如果为false则关闭转义,flask框架中默认为True
{% autoescape false %}
 h1 Hello {{ name }}! /h1 
{% endautoescape %}
# test.html
# 父模板
{% block head %}
{% endblock %}
# 子模板
{% extends "test.html" %}
{% block head %}
{{ super() }}
Index
{% endblock %}

想要渲染父模板中的模板需要使用{{ super() }},即如果父块中已经有语句,不是空的,如果要保留就需要使用这个

注意:继承之后,块内是无法访问块外的变量的,如果想要访问,则:

# scoped参数可以让list块内访问块外的变量
{% block list scoped %}{% endblock %}

包含include

include可以加载另一个模板在当前的位置,直接渲染;

# 直接在当前的位置
 body 
 {% include 'footer.html' %}
 /body 
# 当”include”的模板文件不存在时,程序会抛出异常。可以加上”ignore missing”关键字,这样如果模板不存在,就会忽略这段”{% include %}”语句。
 {% include 'footer.html' ignore missing %}
# 添加多个模板
 {% include ['footer.html','bottom.html','end.html'] ignore missing %}

宏简单来说就是在模板中定义并使用的函数,用来简化代码量

定义一个宏

# 使用macro定义,相当于def
{% macro input(name, type='text', value='') -%}
 input type="{{ type }}" name="{{ name }}" value="{{ value }}" 
{%- endmacro %}

调用一个宏

# 通过表达式调用
 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”。

{% import 'form.html' as form %}
 p {{ form.input('username', value='user') }} /p 

Flask中Jinja2模板引擎详解(一)–控制语句和表达式

https://dormousehole.readthedocs.io/en/latest/templating.html#jinja


Villain博客 , 版权所有丨如有问题请联系客服QQ:1004619丨
转载请注明flask基础之jijia2模板语言进阶(三)
喜欢 (0)
[gqakcom@126.com]
分享 (0)

您必须 登录 才能发表评论!