Django使用Jinja2模板引擎的示例代码
框架(架构)  /  管理员 发布于 7年前   189
Jinja2模板引擎
安装Jinja2 :pip install jinja2,在应用目录下添加jinja2_env.py设定环境变量。
from django.contrib.staticfiles.storage import staticfiles_storagefrom django.urls import reversefrom jinja2 import Environmentdef 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 基本语法
例如:
{# 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过滤器时,显示的结果为
浏览器能显示<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="https:" rel="external nofollow" >Home</a></li> <li><a href="https: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文件。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号