189 8069 5689

如何在Django中使用Jinja2模板引擎-创新互联

如何在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 基本语法

  1. 控制结构{% %}

  2. 变量 {{ }}

  3. 注释{# #}

例如:

{# 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过滤器时,显示的结果为

如何在Django中使用Jinja2模板引擎

浏览器能显示元素,但不会解释它。

当添加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 sidebar %}
        
            
    • Home
    •       
    • Blog
    •     
        {% 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文件。

    关于如何在Django中使用Jinja2模板引擎问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


    新闻标题:如何在Django中使用Jinja2模板引擎-创新互联
    文章分享:http://cdxtjz.com/article/ddeish.html

    其他资讯