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 相关文章推荐
Python类方法__init__和__del__构造、析构过程分析
Mar 06 Python
mac系统安装Python3初体验
Jan 02 Python
基于Django用户认证系统详解
Feb 21 Python
终端命令查看TensorFlow版本号及路径的方法
Jun 13 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
python如何通过pyqt5实现进度条
Jan 20 Python
Tensorflow 实现释放内存
Feb 03 Python
Python交互环境下打印和输入函数的实例内容
Feb 16 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
Jul 30 Python
详解Python openpyxl库的基本应用
Feb 26 Python
Python Selenium操作Cookie的实例方法
Feb 28 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中文汉字验证码
2007/04/08 PHP
php一些公用函数的集合
2008/03/27 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
使用Python的PEAK来适配协议的教程
2015/04/14 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
Python如何判断数独是否合法
2016/09/08 Python
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
如何基于python操作json文件获取内容
2019/12/24 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
会计系个人求职信范文分享
2013/12/20 职场文书
幼儿园元旦亲子活动方案
2014/02/17 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
情感电台广播稿
2015/08/18 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书