Django使用Jinja2模板引擎的示例代码


Posted in Python onAugust 09, 2019

Jinja2模板引擎

安装Jinja2 :pip install jinja2,在应用目录下添加jinja2_env.py设定环境变量。

from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse

from jinja2 import Environment


def environment(**options):
  env = Environment(**options)
  env.globals.update({
    'static': staticfiles_storage.url,
    'url': reverse,
  })
  return env

并在管理目录下setting.py中做出3项修改:

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 基本语法

  1. 控制结构{% %}
  2. 变量 {{ }}
  3. 注释{# #}

例如:

{# jinja2 code #}
{% if {{ i }}> 10 %}
...
{% else %}
....
{% endif %}

Jinja2 变量

在模板中的{{ i }}结构表示变量,这是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据结构中获取。jinja2支持python中所有的Python数据类型比如列表、字段、对象等

<p>this is a dicectory:{{ mydict['key'] }} </p>
<p>this is a list:{{ mylist[3] }} </p>
<p>this is a object:{{ myobject.something() }} </p>

Jinja2变量过滤器

变量的值可以使用过滤器修改。过滤器在添加变量名后,二者以竖线分隔。如:

<p>Hello, {{ user|capitalize }}!</p>

过滤器名 说明
safe 渲染时值不转义
capitialize 把值的首字母转换成大写,其他子母转换为小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML标签都删掉
join 拼接多个值为字符串
replace 替换字符串的值
round 默认对数字进行四舍五入,也可以用参数进行控制
int 把值转换成整型

关于safe过滤器,默认情况下Jinja2出于安全考虑会转义所有变量。当一个变量为<b>Hello</b>没有添加safe过滤器时,显示的结果为

Django使用Jinja2模板引擎的示例代码

浏览器能显示<b>元素,但不会解释它。

当添加safe过滤器时,结果为

当需要显示变量中存储的HTML代码时,可使用safe过滤器。

Jinjia2控制结构

Jinja2提供了多种控制结构,可用来改变模板的渲染流程。

条件判断语句与Python类似,但其不需要使用冒号结尾,而结束控制语句,需要使用endif关键字:

{% if daxin.safe %}
 daxin is safe.
{% elif daxin.dead %}
 daxin is dead
{% else %}
 daxin is okay
{% endif %}

for循环实现一组元素的渲染:

<ul>
{% for user in users %}
 <li>{{ user.username|title }}</li>
{% endfor %}
</ul>

在jinja2中不存在while循环。

Jinja2 宏

宏类似Python代码中的函数。如:

{% macro render_comment(comment) %}  
 <li>{{ comment }}</li>
{% endmacro %}
<ul>
 {% for comment in comments %}
 {{ render_comment(comment)}}
 {% endfor %}
</ul>

还可以将宏保存在单独的文件中,然后在需要的时候导入:

{% import 'macro.html' as macros%}
<ul>
 {% for comment in comments %}
 {{ macros.render_comment(comment)}}
 {% endfor %}
</ul>

Jinja 模板继承

jinja2中最强大的部分就是模板继承,这类似于python代码的类继承。首先创建名为base.html的基模板:

<!DOCTYPE html>
<html lang="en">
<head>
  <link rel="stylesheet" href={{ static('css/mystyle.css') }}>
  <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
  <div id="sidebar">
    {% block sidebar %}
    <ul>
      <li><a href="/" rel="external nofollow" >Home</a></li>
      <li><a href="/blog/" rel="external nofollow" >Blog</a></li>
    </ul>
    {% endblock %}
  </div>

  <div id="content">
    {% block content %}{% endblock %}
  </div>
</body>
</html>

基模板中定义的区块可在衍生模板中覆盖。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 %}
  <h2>{{ topic.id }}</h2>
  <p>{{ topic.text }}</p>
{% endfor %}
{% endblock %}

extends指令声名这个模板衍生自base.html。在extends指令后,基模板的4个区块被重新定义,模板引擎将其插入合适的位置。如果基模板和衍生模板的同名区块有内容,衍生模板的内容会被显示。在衍生模板区块中调用super(),引用基模板的同名内容。topics.html里的head区块引用了基模板的css文件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python3中int(整型)的使用教程
Mar 23 Python
python操作MySQL 模拟简单银行转账操作
Sep 27 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
python一键去抖音视频水印工具
Sep 14 Python
对Django 转发和重定向的实例详解
Aug 06 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
python3 deque 双向队列创建与使用方法分析
Mar 24 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
python实现按日期归档文件
Jan 30 Python
使用scrapy实现增量式爬取方式
Jun 21 Python
在Django admin中编辑ManyToManyField的实现方法
Aug 09 #Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 #Python
python实现网站用户名密码自动登录功能
Aug 09 #Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 #Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 #Python
python实现读取excel文件中所有sheet操作示例
Aug 09 #Python
django ManyToManyField多对多关系的实例详解
Aug 09 #Python
You might like
网友原创的PHP模板类代码
2008/09/07 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
json 入门基础教程 推荐
2009/10/31 Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
2011/12/20 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
微信小程序之GET请求的实例详解
2017/09/29 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
[48:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第二场 1月29日
2021/03/11 DOTA
Python用GET方法上传文件
2015/03/10 Python
python中使用序列的方法
2015/08/03 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
酒后驾驶检讨书
2014/01/27 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
高中美术教学反思
2016/02/17 职场文书
导游词书写之黄山
2019/08/06 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python