相关文章推荐
气势凌人的电池  ·  django ...·  1 周前    · 
发财的黄花菜  ·  Django ForeignKey ...·  4 天前    · 
文雅的煎饼果子  ·  Django 多表查询 - ...·  4 天前    · 
买醉的小熊猫  ·  flutter_blue + ...·  1 年前    · 
腼腆的馒头  ·  nodejs ...·  1 年前    · 

jinja2介绍

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

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

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

安装jinja2模块

   pip install jinja2

Django配置jinja2

  • 在项目文件中创建 jinja2_env.py 文件
  • 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文件
  • 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 基本语法

    控制结构{% %}

    注释{# #}

    #if 结构
    {# jinja2 code #}
    {% if daxin.safe %}
     daxin is safe.
    {% elif daxin.dead %}
     daxin is dead
    {% else %}
     daxin is okay
    {% endif %}
    # for循环
    {% for user in users %}
     <li>{{ user.username|title }}</li>
    {% endfor %}
    <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把值转换成整型

    jinja2模板的使用循环索引

    jinja2自定义过滤器

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

    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 "哈哈"
    
    {{data(birthday,'Y年m月d日')}}
    {{do_listreverse('B')}}
    

    Jinja2 宏

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

    {% macro render_comment(comment) %}  
     <li>{{ comment }}</li>
    {% 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的基模板:

    <!DOCTYPE html>
    <html lang="en">
      <link rel="stylesheet" href={{ static('css/mystyle.css') }}>
      <title>{% block title %}My amazing site{% endblock %}</title>
    </head>
      <div id="sidebar">
        {% block sidebar %}
          <li><a href="/" rel="external nofollow" >Home</a></li>
          <li><a href="/blog/" rel="external nofollow" >Blog</a></li>
        {% endblock %}
      <div id="content">
        {% block content %}{% endblock %}
    </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文件。