Django使用Jinja2模板引擎的示例代码
来源:
中文源码网 浏览:188 次 日期:2024-05-04 15:24:03
【下载文档: Django使用Jinja2模板引擎的示例代码.txt 】
Django使用Jinja2模板引擎的示例代码
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 基本语法
控制结构{% %}
变量 {{ }}
注释{# #}
例如:
{# jinja2 code #}
{% if {{ i }}> 10 %}
...
{% else %}
....
{% endif %}
Jinja2 变量
在模板中的{{ i }}结构表示变量,这是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据结构中获取。jinja2支持python中所有的Python数据类型比如列表、字段、对象等
this is a dicectory:{{ mydict['key'] }}
this is a list:{{ mylist[3] }}
this is a object:{{ myobject.something() }}
Jinja2变量过滤器
变量的值可以使用过滤器修改。过滤器在添加变量名后,二者以竖线分隔。如:
Hello, {{ user|capitalize }}!
过滤器名
说明
safe
渲染时值不转义
capitialize
把值的首字母转换成大写,其他子母转换为小写
lower
把值转换成小写形式
upper
把值转换成大写形式
title
把值中每个单词的首字母都转换成大写
trim
把值的首尾空格去掉
striptags
渲染之前把值中所有的HTML标签都删掉
join
拼接多个值为字符串
replace
替换字符串的值
round
默认对数字进行四舍五入,也可以用参数进行控制
int
把值转换成整型
关于safe过滤器,默认情况下Jinja2出于安全考虑会转义所有变量。当一个变量为
Hello没有添加safe过滤器时,显示的结果为
浏览器能显示
元素,但不会解释它。
当添加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循环实现一组元素的渲染:
{% for user in users %}
- {{ user.username|title }}
{% endfor %}
在jinja2中不存在while循环。
Jinja2 宏
宏类似Python代码中的函数。如:
{% macro render_comment(comment) %}
{{ comment }}
{% endmacro %}
{% 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文件。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持中文源码网。