jinja2模板语法 (flask,过滤器,django)

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)

  • base: 一般用于确定页面布局
<!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)

  • index: 主页专注于内容
{% 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

  • 渲染时不转义 可以直接使用html代码
{{ 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 }}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 声明:转载请注明出处http://www.jianshu.com/p/1664dcfd840c 最近在折腾Djan...
    蛇发女妖阅读 11,457评论 1 10
  • 介绍 Jinja是基于python的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker...
    ZhouLang阅读 12,508评论 0 2
  • 模板: 在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式和...
    帅气的Lucky阅读 5,882评论 0 1
  • 1.模版介绍 这里将会介绍在python的web开发中广泛使用的模版语言jinja2.模版在web开发中使用最为广...
    11的雾阅读 5,216评论 0 3
  • 模板标签除了几个常用的,还真心没有仔细了解一下,看到2.0发布后,翻译学习一下。 本文尽量忠实原著,毕竟大神的东西...
    海明_fd17阅读 6,286评论 0 5

友情链接更多精彩内容