首页 > 其他分享 >Django 框架基础10:模版(T)Django模版引擎、Jinja2模版引擎

Django 框架基础10:模版(T)Django模版引擎、Jinja2模版引擎

时间:2023-02-26 18:24:21浏览次数:52  
标签:10 模版 Django 引擎 Jinja2 jinja2 模板

Django 自带模版

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
Hello,{{ username }} !
<p>我没有定义的变量:{{ no_defined | default:"我是默认值" }}</p>
    
<p>我的年龄是:{{ age }}</p>

{% if age > 10 %}
    <p>我大于10岁</p>
{% else %}
    <p>我不大于10岁</p>
{% endif %}

<p>出生日期是:{{ birthday | date:"Y-m-d H:i:s" }} </p>

<p>朋友有:</p>
<ul>
    {#    {{ forloop.counter }} 可以取出迭代对象的序号#}
    {% for friend in firends %}
        <li>{{ forloop.counter }} {{ friend }}</li>
    {% endfor %}
</ul>

<p>我共有 {{ firends | length }} 个朋友</p>

<!-- html中列表取值用 list.index 的形式,不能用 list[index] -->
<p>女朋友是:{{ firends.2 }} </p>

<p>工资是:{{ money }}</p>

<p> 2019年工资是:{{ money.2019 }}</p>
<ul>
    {# 注释:循环字典的形式 for key ,value in dict.items #}
    {% for year, money in money.items %}
        <li> {{ forloop.counter }}、{{ year }}年 : {{ money }}元</li>
    {% endfor %}
</ul>
{#单行注释#}
{% comment %}
          这里是多行注释
        {% endcomment %}
<hr>
我的简介是 {{ desc | safe }}
<hr>
</body>
</html>
from django.views import View
class HomeView(View):

    def get(self, request):
        username = request.GET.get('username')
        context = {
            'username': username,
            'age': 14,
            'birthday': datetime.datetime.now(),
            'firends': ['tome', 'jack', 'rose'],
            'money': {
                '2019': 12000,
                '2020': 15000,
                '2021': 20000
            }
        }
        return render(request, 'index.html', context=context)

1、模版变量

  • 模板变量 {{ var_name }}

变量名必须有字母、数字、下划线(不能以下划线开头)和点组成,语法如下:{{ 变量名 }}
模板变量可以使用python的内建类型(字符串、数字等),也可以是对象(字典、列表、元组等)。

  • 列表取值

html中列表取值用 {{ list.index }} 的形式,不能用 {{ list[index] }};如:friends.2

  • 字典取值

html中字典取单个值要用 {{ dict.name }}的形式,如,salary.2019;

html中字典取所有值,for 循环 {% for key, value in dict**.items** %} ,注意字典变量后面一定要加 .items

2、流程控制

  • for循环

{{ forloop.counter }} 可以取出迭代对象的序号,如列表,字典;

<!-- {{ forloop.counter }} 可以取出迭代对象的序号 -->
{% for friend in friends %}
    <li>{{ forloop.counter }} {{friend }}</li>
{% empty %}     <!--列表为空,或不存在时执行此逻辑-->
{% endfor %}

完整的forloop包括:

{‘parentloop’: {}, ‘counter0’: 0, ‘counter’: 1, ‘revcounter’: 3, ‘revcounter0’: 2, ‘first’: True, ‘last’: False} tom
{‘parentloop’: {}, ‘counter0’: 1, 'counter’: 2, ‘revcounter’: 2, ‘revcounter0’: 1, ‘first’: False, ‘last’: False} jack
{‘parentloop’: {}, ‘counter0’: 2, ‘counter’: 3, ‘revcounter’: 1, ‘revcounter0’: 0, ‘first’: False, ‘last’: True} rose
  • if判断

比较运算符:==、!=、<、>、<=、>=
布尔运算符:and、or、not
注意:运算符左右两侧不能紧挨着变量或常量,必须有空格

{% if age > 10 %}
    我大于10岁
{% elif %}
    我不大于10岁
{% else %}
    我不知道几岁
{% endif %}
  • 注释
{#单行注释#}
{% comment %}
    这里是多行注释
{% endcomment %}

3、过滤器(本质为函数)

语法:变量|过滤器:“参数”

使用管道符号|来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中。
如果过滤器需要参数,则使用冒号:传递参数

  • safe,禁用转义,告诉模板这个变量是安全的,可以解释执行
我的简介是 {{ desc | safe }}

  • length,长度,返回字符串包含字符的个数,或列表元组字典的元素个数。
<p>我共有 {{ firends | length }} 个朋友</p>

  • default,默认值,如果变量不存在时则返回默认值。 如datal|default:‘默认值’
<p>我没有定义的变量:{{ no_defined | default:"我是默认值" }}</p>

  • date,日期,用于对日期类型的值进行字符串格式化常用的格式化字符如下:
<p>出生日期是:{{ birthday | date:"Y-m-d H:i:s" }} </p>

Y表示年,格式为4位,y表示两位的年
m表示月,格式为01.02.12等
d表示日,格式为01.02等
j表示日,格式为12等
H表示时,24进制,h表示12进制的时
i表示分,为0-59
s表示秒,为0-59
如{{ birthday | date:“Y-m-d H:i:s” }}
注意:过滤器中间不能有空格

4、模版继承

  • 父模版

如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。
标签 block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同。为了更好的可读性建议给 endblock标签写上名字,这个名字与对应的 block名字相同,父模板中也可以使用上下文中传递过来的数据。

  • 子模版

标签 extends:继承,写在子模板文件的第一行 {% block名称 %}
预留区域,可以编写默认内容,也可以没有默认内容 {% endblock名称 %}
子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值 {% extends “父模板路径” %}

Jinja2模版

Jinja2是 Python下一个被广泛应用的模板引擎,是由 Python实现的模板语言,他的设计思想来源于 Django的模板引擎,并扩展了其语法和一系列强大的功能,尤其是 Flask框架内置的模板语言。
由于django默认模板引擎功能不齐全速度慢,所以我们也可以在 Django中使用jinja2,jinja2宣称比django默认模板引擎快10-20倍。
Django主流的第三方APP基本上也都同时支持Django默认模板及jinjia2,所以要用jinja2也不会有多少障碍。

  • 安装
pip3 install Jinja2

设置 BACKEND'django.template.backends.jinja2.Jinja2' 以配置一个 Jinja2 引擎。

默认Jinja2环境'environment': 'jinja2.Environment'

Jinja2模版使用

jinja2模板以函数的形式调用:{{ function(request) }}

重写Jinja2环境,创建jinja2.py

from jinja2 import Environment
from django.template.defaultfilters import date, default, length, safe

def environment(**options):
    # 1、创建Environment 实例对象
    env = Environment(**options)

    # 2、指定(更新)jinja2的函数指向Django的指定过滤器
    env.globals.update({
        'default': default,
        'date': date,
        'length': length,
        'safe': safe,
    })

    # 3、返回Environment实例
    return env

修改默认jinja2环境

'environment': 'apps.jinja2.environment'

修改pycharm的模板语言为jinja2

jinja2自定义过滤器

Jinja2语法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <ul>
        {% for book in books %}
            <li>{{ book.name }}</li>
        {% endfor %}
    </ul>
    Hello,{{ username }} !
    <hr>

    <hr>
    我的年龄是:{{ age }} <br>
    {% if age > 10 %}
        我大于10岁
    {% else %}
        我不大于10岁
    {% endif %} <br>
    <!-- {#  我没有定义的变量:{{ no_defined | default:"我是默认值" }} #} -->
    我没有定义的变量:{{ default(no_defined, "我是默认值") }}
    <!-- {# 出生日期是:{{ birthday | date:"Y-m-d H:i:s" }} #} -->
    出生日期是:{{ date(birthday, "Y-m-d H:i:s") }} <br>
    朋友有:
    <ul>
        <!-- Django是forloop, jinja2是loop -->
        <!-- {# {{ loop.index }} 可以取出迭代对象的序号 #} -->
        {% for friend in friends %}
            <li>{{ loop.index }} {{friend }}</li>
        {% endfor %}
    </ul>
    <!-- 我共有 {{ friends | length }} 个朋友  <br> -->
    我共有 {{ length(friends) }} 个朋友  <br>

    <!-- html中列表取值用 list.index 的形式,不能用 list[index] -->
    女朋友是:{{ friends.2 }} <br>    工资是:{{ salary }}
    <ul>
        <!-- {# 注释:django 循环字典的形式 for key ,value in dict.items #} -->
        {# {% for year, money in salary.items %} #}
          <li> {# {{ loop.index }}:{{ year }} : {{ money }}  #}</li>
        {# {% endfor %} #}
        <!-- jinja2字典取值是dict[key],和Python完全一样 -->
        {% for year in salary %}
          <li> {{ loop.index }}:{{ year }} : {{ salary[year] }} </li>
        {% endfor %}
        <li> 2021年工资是:{{ salary['2021'] }}</li>
    </ul>
    <!-- {# jinja2 没有多行注释,只有单行注释 #} -->
    <hr>
    <!-- {# 我的简介是 {{ desc | safe }} #} -->
    我的简介是 {{ safe(desc) }}
    <hr>
</body>
</html>

Django和Jinja2语法差异对比

 

标签:10,模版,Django,引擎,Jinja2,jinja2,模板
From: https://www.cnblogs.com/zhoubai/p/17157226.html

相关文章