本文共 3700 字,大约阅读时间需要 12 分钟。
Django使用jinja2模板
jinja2介绍
Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,尤其是Flask框架内置的模板语言
由于django默认模板引擎功能不齐全,速度慢,所以我们也可以在Django中使用jinja2, jinja2宣称比django默认模板引擎快10-20倍。
Django主流的第三方APP基本上也都同时支持Django默认模板及jinja2,所以要用jinja2也不会有多少障碍。
安装jinja2模块
pip install jinja2
Django配置jinja2
- 在项目文件中创建 jinja2_env.py 文件
from django.contrib.staticfiles.storage import staticfiles_storagefrom django.template.defaultfilters import datafrom django.urls import reversefrom jinja2 import Environmentdef environment(**options): env = Environment(**options) env.globals.update({ 'static': staticfiles_storage.url, 'url': reverse,#替换默认url解析 'data':data #替换默认过滤器 }) return env
- 在settings.py文件
TEMPLATES = [ { 'BACKEND': 'django.template.backends.jinja2.Jinja2', # 1 'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'learning_logs/templates')] # 2 , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], 'environment': 'learning_logs.jinja2_env.environment', # 3 }, },]
Jinja2语法
Jinja2的语法与template类似,对比template,它更加灵活、快速和安全。
Jinja2 基本语法
- 控制结构{% %}
- 变量 { { }}
- 注释{# #}
例如:
#if 结构{ # jinja2 code #}{ % if daxin.safe %} daxin is safe.{ % elif daxin.dead %} daxin is dead{ % else %} daxin is okay{ % endif %}# for循环
- { % for user in users %}
- { { user.username|title }} { % endfor %}
this is a dicectory:{
{ mydict['key'] }}this is a list:{
{ mylist[3] }}this is a object:{
{ myobject.something() }} # 过滤器Hello, {
{ user|capitalize }}!Jinja2自带过滤器
过滤器名 | 说明 |
---|---|
safe | 渲染时值不转义 |
capitialize | 把值的首字母转换成大写,其他子母转换为小写 |
lower | 把值转换成小写形式 |
upper | 把值转换成大写形式 |
title | 把值中每个单词的首字母都转换成大写 |
trim | 把值的首尾空格去掉 |
striptags | 渲染之前把值中所有的HTML标签都删掉 |
join | 拼接多个值为字符串 |
replace | 替换字符串的值 |
round | 默认对数字进行四舍五入,也可以用参数进行控制 |
int | 把值转换成整型 |
jinja2模板的使用循环索引
jinja2自定义过滤器
在jinja2_env.py文件中自定义过滤器from jinja2 import Environmentdef environment(**options): env = Environment(**options) # 2.将自定义的过滤器添加到 环境中 env.filters['do_listreverse'] = do_listreverse return env# 1.自定义过滤器def do_listreverse(li): if li == "B": return "哈哈"
使用如下
{ { data(birthday,'Y年m月d日')}}{ { do_listreverse('B')}}
Jinja2 宏
宏类似Python代码中的函数。如:
{ % macro render_comment(comment) %}
- { % for comment in comments %} { { render_comment(comment)}} { % endfor %}
还可以将宏保存在单独的文件中,然后在需要的时候导入:
{ % import 'macro.html' as macros%}
- { % for comment in comments %} { { macros.render_comment(comment)}} { % endfor %}
Jinja 模板继承
jinja2中最强大的部分就是模板继承,这类似于python代码的类继承。首先创建名为base.html的基模板:
{ % block title %}My amazing site{ % endblock %} { % block content %}{ % endblock %}
基模板中定义的区块可在衍生模板中覆盖。Jinja2使用block和endblock指令在基模板中定义内容区块。在上述基模板中定义了head、title、content和footer区块。
新建一个topics.html的文件,继承基模板,用来显示全部的topics。
{ % extends "base.html" %}{ % block title %}Topics{ % endblock %}{ % block head %} { { super() }}{ % endblock %}{ % block content %}{ % for topic in topics %}{ { topic.id }}
{
{ topic.text }}{ % endfor %}{ % endblock %}
extends指令声名这个模板衍生自base.html。在extends指令后,基模板的4个区块被重新定义,模板引擎将其插入合适的位置。如果基模板和衍生模板的同名区块有内容,衍生模板的内容会被显示。在衍生模板区块中调用super(),引用基模板的同名内容。topics.html里的head区块引用了基模板的css文件。
转载地址:https://codeboy.blog.csdn.net/article/details/115599366 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!