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 相关文章推荐
下载给定网页上图片的方法
Feb 18 Python
python列表操作实例
Jan 14 Python
Python中的descriptor描述器简明使用指南
Jun 02 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 Python
Python基础教程之利用期物处理并发
Mar 29 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
python制作朋友圈九宫格图片
Nov 03 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
安装不同版本的tensorflow与models方法实现
Feb 20 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
第十三节 对象串行化 [13]
2006/10/09 PHP
论坛头像随机变换代码
2006/10/09 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
微信公众平台天气预报功能开发
2014/07/06 PHP
php检查页面是否被百度收录
2015/10/28 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
将python安装信息加入注册表的示例
2019/11/20 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
AmazeUI 平滑滚动效果的示例代码
2020/08/20 HTML / CSS
前台文员岗位职责及工作流程
2013/11/19 职场文书
大学毕业自我评价
2014/02/02 职场文书
理工类毕业自我鉴定
2014/02/20 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
公司年会开场白
2015/06/01 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python
Python合并pdf文件的工具
2021/07/01 Python
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android