jinja2模板语法
一. 使用jinja2
1. flask自带jinja2
2. tonado 安装方法
pip install tonado-jinja2
from tornado_jinja2 import Jinja2Loader
jinja2Loader = Jinja2Loader('templates')
def make_app():
return tornado.web.Application(handlers=[
(r'/index/', IndexHandler)
],
template_loader = jinja2Loader,
)
3. django换模板引擎
- 专业版的pycharm 创建django项目时可以直接选择jinja2模板引擎
- 非专业版
使用如下命令安装 Jinja2
pip install jinja2
配置
首先,在项目配置目录下建立一个jinja2_env.py,内容如下
# from __future__ import absolute_import # 如果是py2就取消这行的注释
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 设置
CONTEXT_PROCESSORS = [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': CONTEXT_PROCESSORS,
},
},
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': CONTEXT_PROCESSORS,
'environment': 'APP_NAME.jinja2_env.environment',
},
},
]
url和static函数
在 Django 模板中,url 和 static 函数应该像如下使用
{% url 'auth:login' parameter %}
{% static 'image/avatar/1.jpg' %}
1
2
而在 Django 的 Jinja2 中需要更改成如下方式
{% url('auth:login', args=(1,)) %}
{% static('image/avatar/1.jpg') %}
1
2
在 url 函数中的 args 是用来传参的元组,所以不能省略后面的逗号
---------------------
作者:widiot1
来源:CSDN
原文:https://blog.csdn.net/White_Idiot/article/details/79575037
版权声明:本文为博主原创文章,转载请附上博文链接!
二. 模板jicheng
a. 父模板(base.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
{% block title %}
{% endblock %}
</title>
{% block css %}
{% endblock %}
{% block js %}
{% endblock %}
</head>
<body>
<div id = "heard">
{% block heard %}
{% endblock %}
<div>
<div id = "content">
{% block content %}
{% endblock %}
<div>
<div id = "footnote">
{% block footnote %}
{% endblock %}
<div>
</body>
</html>
b. 中间模板(basemain.html)
- basemain: 用于统一不变的内容,如果有多种风格可以定义多个basemain
{% block css %}
*****************
{% endblock %}
{% block js %}
*****************
{% endblock %}
{% block heard %}
<h1> 这是导航栏</h1>
{% endblock %}
{% block footnote %}
<h1> 这是脚注栏 </h1>
{% endblock %}
c. 继承模板(index.html)
{% extends 'basemain.html' %}
{% block title %}
你好啊
{% endblock %}
{% block content %}
<h1>乌拉</h1>
{% endblock %}
d. super继承
- super: 需要在页面中添加basemain中没有的内容, 时可以使用super,这样不会破坏basemain中的设
{% block js %}
{{ super() }}
{# 添加新的js代码 #}
{% endblock %}
三. 分支循环(if for)
1. 后端传入参数
# tonado
return render_template('index.html', item1=data)
{{ item1 }} # 模板中直接使用
2. for
{% for item in item1 %}
{{ item }}
{% endfor %}
3. if
{% if item == 'django' %}
<span style="color:red;">{{ item }}</span>
{% else %}
{{ item }}
{% endif %}
四. 宏定义(macro)
1. 定义
{# 宏定义 macro 无参数 #}
{% macro say() %}
<p>你好帅</p>
{% endmacro %}
{# 宏定义 macro 带参数 #}
{% macro hello(name) %}
<p>{{ name }}好帅</p>
{% endmacro %}
2. 使用
{{ say() }}
{{ hello('我') }}
3. 导入其他html中的macro(定制宏html)
{% from 'function.html' import say, hello %}
{{ say() }}
{{ hello('我') }}
五. 过滤器
1. 常用过滤器
a. 最常用的safe
{{ article.content|safe }}
b. 其他过滤器
| 过滤器 |
说明 |
| safe |
渲染时不转义 |
| capitalize |
把值的首字母转换成大写,其他字母转换成小写 |
| lower |
把值转换成小写形式 |
| upper |
把值转换成大写形式 |
| title |
把值中每个单词的首字母都转换成大写 |
| trim |
把值的首尾空格去掉 |
| striptags |
渲染前把值中所有的HTML标签都删掉 |
c. jinja2中所有的过滤器
'abs': abs,
'attr': do_attr,
'batch': do_batch,
'capitalize': do_capitalize,
'center': do_center,
'count': len,
'd': do_default,
'default': do_default,
'dictsort': do_dictsort,
'e': escape,
'escape': escape,
'filesizeformat': do_filesizeformat,
'first': do_first,
'float': do_float,
'forceescape': do_forceescape,
'format': do_format,
'groupby': do_groupby,
'indent': do_indent,
'int': do_int,
'join': do_join,
'last': do_last,
'length': len,
'list': do_list,
'lower': do_lower,
'map': do_map,
'pprint': do_pprint,
'random': do_random,
'reject': do_reject,
'rejectattr': do_rejectattr,
'replace': do_replace,
'reverse': do_reverse,
'round': do_round,
'safe': do_mark_safe,
'select': do_select,
'selectattr': do_selectattr,
'slice': do_slice,
'sort': do_sort,
'string': soft_unicode,
'striptags': do_striptags,
'sum': do_sum,
'title': do_title,
'trim': do_trim,
'truncate': do_truncate,
'upper': do_upper,
'urlencode': do_urlencode,
'urlize': do_urlize,
'wordcount': do_wordcount,
'wordwrap': do_wordwrap,
'xmlattr': do_xmlattr,
'tojson': do_tojson,
2. 自定义过滤器
a. 定义
# 自定义时间过滤器
def format_date(timestamp):
return timestamp.strftime('%Y-%m-%d %H:%M:%S')
# 自定义数据长度过滤器
def len_data(data):
return len(data)
# 添加到模板引擎
app.add_template_filter(format_date, 'format_time')
app.add_template_filter(len_data, 'len_data')
b.使用
{# 时间格式转换 #}
{{ article.create_time | format_time }}
{# 取列表元素数目 #}
{{ articles|len_data }}