前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2022年01月 Python教学课程 52-Django框架之jinja2模板

【愚公系列】2022年01月 Python教学课程 52-Django框架之jinja2模板

作者头像
愚公搬代码
发布2022-12-01 10:06:29
1.3K0
发布2022-12-01 10:06:29
举报
文章被收录于专栏:历史专栏

文章目录


一、Django使用jinja2模板

jinja2介绍

Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,尤其是Flask框架内置的模板语言

由于django默认模板引擎功能不齐全,速度慢,所以我们也可以在Django中使用jinja2, jinja2宣称比django默认模板引擎快10-20倍。

Django主流的第三方APP基本上也都同时支持Django默认模板及jinja2,所以要用jinja2也不会有多少障碍。

安装jinja2模块

代码语言:javascript
复制
   pip install jinja2

1.Django配置jinja2

  • 在项目文件中创建 jinja2_env.py 文件
代码语言:javascript
复制
from django.contrib.staticfiles.storage import staticfiles_storage
from django.template.defaultfilters import data
from django.urls import reverse

from jinja2 import Environment


def environment(**options):
  env = Environment(**options)
  env.globals.update({
    'static': staticfiles_storage.url,
    'url': reverse,#替换默认url解析
    'data':data #替换默认过滤器
  })
  return env
  • 在settings.py文件
代码语言:javascript
复制
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
    },
  },
]

2.Jinja2语法

Jinja2的语法与template类似,对比template,它更加灵活、快速和安全。

Jinja2 基本语法

  • 控制结构{% %}
  • 变量 {{ }}
  • 注释{# #}

例如:

代码语言:javascript
复制
#if 结构
{# jinja2 code #}
{% 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>
#变量
<p>this is a dicectory:{{ mydict['key'] }} </p>
<p>this is a list:{{ mylist[3] }} </p>
<p>this is a object:{{ myobject.something() }} </p>
# 过滤器
<p>Hello, {{ user|capitalize }}!</p>

Jinja2自带过滤器

过滤器名

说明

safe

渲染时值不转义

capitialize

把值的首字母转换成大写,其他子母转换为小写

lower

把值转换成小写形式

upper

把值转换成大写形式

title

把值中每个单词的首字母都转换成大写

trim

把值的首尾空格去掉

striptags

渲染之前把值中所有的HTML标签都删掉

join

拼接多个值为字符串

replace

替换字符串的值

round

默认对数字进行四舍五入,也可以用参数进行控制

int

把值转换成整型

3.jinja2模板的使用循环索引

4.jinja2自定义过滤器

Django文档 在jinja2_env.py文件中自定义过滤器

代码语言:javascript
复制
from jinja2 import Environment

def environment(**options):
    env = Environment(**options)

    # 2.将自定义的过滤器添加到 环境中
    env.filters['do_listreverse'] = do_listreverse

    return env

# 1.自定义过滤器
def do_listreverse(li):
    if li == "B":
        return "哈哈"

使用如下

代码语言:javascript
复制
{{data(birthday,'Y年m月d日')}}
{{do_listreverse('B')}}

5.Jinja2 宏

宏类似Python代码中的函数。如:

代码语言:javascript
复制
{% macro render_comment(comment) %}  
 <li>{{ comment }}</li>
{% endmacro %}
<ul>
 {% for comment in comments %}
 {{ render_comment(comment)}}
 {% endfor %}
</ul>

还可以将宏保存在单独的文件中,然后在需要的时候导入:

代码语言:javascript
复制
{% import 'macro.html' as macros%}
<ul>
 {% for comment in comments %}
 {{ macros.render_comment(comment)}}
 {% endfor %}
</ul>

6.Jinja2 模板继承

jinja2中最强大的部分就是模板继承,这类似于python代码的类继承。首先创建名为base.html的基模板:

代码语言:javascript
复制
<!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。

代码语言:javascript
复制
{% 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文件。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、Django使用jinja2模板
    • 1.Django配置jinja2
      • 2.Jinja2语法
        • 3.jinja2模板的使用循环索引
          • 4.jinja2自定义过滤器
            • 5.Jinja2 宏
              • 6.Jinja2 模板继承
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档