当前位置:   article > 正文

Jinja2模板语言最基础入门_jinja2模板语法

jinja2模板语法

flask默认使用的模板引擎是jinja2,它是一个功能齐全的python模板引擎,除了设置变量,还允许我们添加if判断,执行for循环,调用函数等。以各种方式控制模板的输出。

对应jinja2来说,模板可以是任何格式的纯文本文件,比如HTML、XML、CSV等。

目录

1.1模板变量

1.2模板语句

1)for循环:

2)if条件:

3)注释

1.3结构标签

1.4空白处理

2.1过滤器

3.1包含

3.2宏


1.1模板变量

变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。

语法如下:

{{ var }} 

你可以使用点( . )来访问变量的属性,作为替代,也可以使用所谓的“下标”语 法( [])。下面的几行效果是一样的:

  1. {{foo.bar }}
  2. {{ foo['bar'] }}

如果变量或属性不存在,会返回一个未定义值。

  1. def book_list(request):
  2. books = BookInfo.objects.all()
  3. context = {'books': books}
  4. return render(request, 'book_list.html', context)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>图书列表</title>
  6. </head>
  7. <body>
  8. {{ books }}
  9. <br>
  10. {{ books.0 }}
  11. <br>
  12. {{ books.0.author }}
  13. </body>
  14. </html>

1.2模板语句

1)for循环:

和其它语句一样,需要在for循环的结尾使用 {% endfor %} 标签声明for语句的结束。

  1. {% for row in rows %}
  2. <li class="{{ loop.cycle('odd', 'even') }}">{{ row }}</li>
  3. {% endfor %}
  4. loop.index
  5. loop.index0
  6. loop.reindex
  7. loop.reindex0
  8. loop.first
  9. loop.last
  10. loop.length
  11. loop.cycle
  12. loop.depth
  13. loop.depth0
  14. loop.previtem
  15. loop.nextitem

在for循环内,jinja2提供了多个特殊变量,

变量名作用
loop.index当前迭代数,从1开始计数
loop.index()当前迭代数,从0开始计数
loop.revindex当前反向迭代数,从1开始计数
loop.revindex()当前反向迭代数,从0开始计数
loop.first如果是第一个元素则为True
loop.last如果是最后一个元素则为True
loop.previtem上一个迭代的条目
loop.nextitem下一个迭代的条目
loop.length序列中元素的数量
  • else,iteration为空,执行else
  1. <ul>
  2. {% for user in users %}
  3. <li>{{ user.username|e }}</li>
  4. {% else %}
  5. <li><em>no users found</em></li>
  6. {% endfor %}
  7. </ul>
  • for if
  1. {% for user in users if not user.hidden %}
  2. <li>{{ user.username|e }}</li>
  3. {% endfor %}
  • 递归 for
  1. <ul class="sitemap">
  2. {%- for item in sitemap recursive %}
  3. <li><a href="{{ item.href|e }}">{{ item.title }}</a>
  4. {%- if item.children -%}
  5. <ul class="submenu">{{ loop(item.children) }}</ul>
  6. {%- endif %}</li>
  7. {%- endfor %}
  8. </ul>

loop的例子:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{{ user.username }}'s watchlist</title>
  6. </head>
  7. <body>
  8. <a href="{{ url_for('hi') }}">← Return</a>
  9. <h2>{{ user.username}}</h2>
  10. {% if user.bio %}
  11. <i>{{ user.bio }}</i>
  12. {% else %}
  13. <i>This user has not provided a bio.</i>
  14. {% endif %}
  15. {# 以下是电影清单(这是注释) #}
  16. <h5>{{ user.username }}'s watchlist ({{ movies|length }}):</h5>
  17. <ul>
  18. {% for movie in movies %}
  19. <li>loop.index:{{ loop.index }} loop.first:{{ loop.first }}
  20. loop.last:{{ loop.last }} - {{ movie.name }} - {{ movie.year }}</li>
  21. {% endfor %}
  22. </ul>
  23. </body>
  24. </html>

浏览器访问:http://127.0.0.1:5000/watchlist 

2)if条件:

  1. {% if ... %}
  2. {% elif ... %}
  3. {% else %}
  4. {% endif %}

比较运算符如下:

  1. ==
  2. !=
  3. <
  4. >
  5. <=
  6. >=

布尔运算符如下:

  1. and
  2. or
  3. not

3)注释

{{ #...#}}

1.3结构标签

  1. block
  2. {% block xxx %}
  3. pass
  4. {% endblock %}
  5. extends
  6. {% extends 'xxx' %}
  7. 续承后保留块中的内容
  8. {{ super() }}
  9. include
  10. {% include 'xxx' %}
  11. 包含,将其他HTML包含进来,体现的是由零到一的概念
  12. marco
  13. {% marco hello(name) %}
  14. {{ name }}
  15. {% endmarco %}
  16. 宏定义,可以在模块中定义函数,在其他地方调用
  17. 宏定义可以导入
  18. {% from 'xx' import xxx %}

jinja2通过了多种控制结构来控制模板的输出,其中for和if是最常用的2种。jinja2里,语句使用{undefined{%...%}}标识。需要注意的是,在语句结束的地方,必须添加结束标签,如:

  1. {% if user.bio %}
  2. <i>{{ user.bio }}</i>
  3. {% else %}
  4. <i>This user has not provided a bio.</i>
  5. {% endif %}

在这个if语句中,如果user.bio已经定义,就渲染{% if user.bio %}和{% else %}之间的内容,否则就渲染{% else %}和{% endif %}之间的内容。末尾的{% endif %}用来表示if语句的结束,不能省略。

1.4空白处理

您也可以手动去除模板中的空白。 如果加减号 符号 ( -) 到块的开头或结尾(例如 For 标签),a 注释或变量表达式,之前或之后的空格 该块将被删除:

  1. {% for item in seq -%}
  2. {{ item }}
  3. {%- endfor %}

不得在标记和减号之间添加空格。

有效

{%- if foo -%}...{% endif %}

无效

{% - if foo - %}...{% endif %}

2.1过滤器

过滤器:本质上就是一个python语言定义的一个方法,但是在模板语言中不能直接调用python的方法,只能通过过滤器的方式来调用。

即python中定义方法,仍后将方法加入到过滤器列表中,加入后就可以在模板语言中进行调用。     而且模板语言支持链式调用,比如:{{"hello world" | reverse | upper }}

模板语言过滤器调用格式:{{variable | filter_func_name(*args)}}
没有参数时可以将参数括号省略如:{{variable | filter_func_name}}
链式调用:{{variable | filter_func_name1 | filter_func_name2}}
字符串操作

  1. safe:禁用转义
  2. <p>{{ '<em>hello</em>' | safe }}</p>
  3. capitalize:把变量值的首字母转成大写,其余字母转小写
  4. <p>{{ 'hello' | capitalize }}</p>
  5. lower:把值转成小写
  6. <p>{{ 'HELLO' | lower }}</p>
  7. upper:把值转成大写
  8. <p>{{ 'hello' | upper }}</p>
  9. title:把值中的每个单词的首字母都转成大写
  10. <p>{{ 'hello' | title }}</p>
  11. reverse:字符串反转
  12. <p>{{ 'olleh' | reverse }}</p>
  13. format:格式化输出
  14. <p>{{ '%s is %d' | format('name',17) }}</p>
  15. striptags:渲染之前把值中所有的HTML标签都删掉
  16. <p>{{ '<em>hello</em>' | striptags }}</p>
  17. truncate: 字符串截断
  18. <p>{{ 'hello every one' | truncate(9)}}</p>

列表操作:

  1. first:取第一个元素
  2. <p>{{ [1,2,3,4,5,6] | first }}</p>
  3. last:取最后一个元素
  4. <p>{{ [1,2,3,4,5,6] | last }}</p>
  5. length:获取列表长度
  6. <p>{{ [1,2,3,4,5,6] | length }}</p>
  7. sum:列表求和
  8. <p>{{ [1,2,3,4,5,6] | sum }}</p>
  9. sort:列表排序
  10. <p>{{ [6,2,3,1,5,4] | sort }}</p>
  11. 语句块过滤
  12. {% filter upper %}
  13. #一大堆文字#
  14. {% endfilter %}

自定义过滤器:
自定义过滤器有两种实现方式:
一种是通过Flask应用对象的 add_template_filter 方法

  • 通过调用应用程序实例的 add_template_filter 方法实现自定义过滤器。该方法第一个参数是函数名,第二个参数是自定义的过滤器名称:
  1. def do_listreverse(li):
  2. # 通过原列表创建一个新列表
  3. temp_li = list(li)
  4. # 将新列表进行返转
  5. temp_li.reverse()
  6. return temp_li
  7. app.add_template_filter(do_listreverse,'lireverse')
  • 用装饰器来实现自定义过滤器。装饰器传入的参数是自定义的过滤器名称。
    1. @app.template_filter('lireverse')
    2. def do_listreverse(li):
    3. # 通过原列表创建一个新列表
    4. temp_li = list(li)
    5. # 将新列表进行返转
    6. temp_li.reverse()
    7. return temp_li

    在 html 中使用该自定义过滤器

    1. <br/> my_array 原内容:{{ my_array }}
    2. <br/> my_array 反转:{{ my_array | lireverse }}

    运行结果

  1. my_array 原内容:[3, 4, 2, 1, 7, 9]
  2. my_array 反转:[9, 7, 1, 2, 4, 3]

3.1包含

Jinja2模板中,除了宏和继承,还支持一种代码重用的功能,叫包含(Include)。

功能是将另一个模板整个加载到当前模板中,并直接渲染。

  • include的使用
{% include 'hello.html' %}

包含在使用时,如果包含的模板文件不存在时,程序会抛出TemplateNotFound异常,可以加上 ignore missing 关键字。如果包含的模板文件不存在,会忽略这条include语句。

  • include 的使用加上关键字ignore missing
{% include 'hello.html' ignore missing %}

3.2 宏

对宏(macro)的理解:
把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串。
为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复使用。

定义宏:

  1. {% macro input(name,value='',type='text') %}
  2. <input type="{{type}}" name="{{name}}"
  3. value="{{value}}" class="form-control">
  4. {% endmacro %}

调用宏:

{{ input('name' value='zs')}}

上面对于宏的调用,相当于输出

  1. <input type="text" name="name"
  2. value="zs" class="form-control">

把宏单独抽取出来,封装成html文件,其它模板中导入使用,文件名可以自定义macro.html

  1. {% macro input(label="", type="text", name="", value="") %}
  2. <label>{{ label }}</label>
  3. <input type="{{ type }}" name="{{ name }}"
  4. value="{{ value }}">
  5. {% endmacro %}

参考文档:Jinja模板语法官方文档

jinja2语法_王培军的博客-CSDN博客_jinja2语法 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/191417
推荐阅读
相关标签
  

闽ICP备14008679号