Django 4.1:模板T.Django模板

目录

一、Django使用自带模板

1. 配置

2. 定义模板

3. 模板渲染

4. 模板语法

4.1 模板变量

 4.2 模板语句

4.3 注释

5. 过滤器

5. 模板继承

二、Django使用jinja2模板

1. jinja2介绍

2. 安装jinja2模块

3. Django配置jinja2

4. jinja2模板的使用绝大多数和Django自带模板一样

 5. jinja2自定义过滤器


一、Django使用自带模板

1. 配置

在工程中创建模板目录templates。

在settings.py配置文件中修改TEMPLATES配置项的DIRS值:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 此处修改
        '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',
            ],
        },
    },
]

2. 定义模板

在templates目录中新建一个模板文件,如index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ city }}
</body>
</html>

3. 模板渲染

调用模板分为两步骤:

  1. 找到模板 loader.get_template(模板文件在模板目录中的相对路径) -> 返回模板对象

  2. 渲染模板 模板对象.render(context=None, request=None) -> 返回渲染后的html文本字符串 context 为模板变量字典,默认值为None request 为请求对象,默认值为None

例如,定义一个视图

from django.http import HttpResponse
from django.template import loader

def index(request):
    # 1.获取模板
    template=loader.get_template('index.html')

    context={'city': '北京'}
    # 2.渲染模板
    return HttpResponse(template.render(context))

Django提供了一个函数render可以简写上述代码。

render(request对象, 模板文件路径, 模板数据字典)

from django.shortcuts import render

def index(request):
    context={'city': '北京'}
    return render(request,'index.html',context)

4. 模板语法

4.1 模板变量

变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。

语法如下:

{{变量}}

模板变量可以使python的内建类型,也可以是对象。

def index(request):
    context = {
        'city': '北京',
        'adict': {
            'name': '西游记',
            'author': '吴承恩'
        },
        'alist': [1, 2, 3, 4, 5]
    }
    return render(request, 'index.html', context)

 4.2 模板语句

1)for循环:

  

2)if条件:

比较运算符如下:

==
!=
<
>
<=
>=

布尔运算符如下:

and
or
not

注意:运算符左右两侧不能紧挨变量或常量,必须有空格。

{% if a == 1 %}  # 正确
{% if a==1 %}  # 错误

4.3 注释

1)单行注释语法如下:

{#...#}

2)多行注释使用comment标签,语法如下:

{# comment #}
...
{# endcomment #}

5. 过滤器

语法如下:

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

列举几个如下:

  • safe,禁用转义,告诉模板这个变量是安全的,可以解释执行

  • length,长度,返回字符串包含字符的个数,或列表、元组、字典的元素个数。

  • default,默认值,如果变量不存在时则返回默认值。

  • data|default:'默认值'
    
  • date,日期,用于对日期类型的值进行字符串格式化,常用的格式化字符如下:

    • Y表示年,格式为4位,y表示两位的年。
    • m表示月,格式为01,02,12等。
    • d表示日, 格式为01,02等。
    • j表示日,格式为1,2等。
    • H表示时,24进制,h表示12进制的时。
    • i表示分,为0-59。
    • s表示秒,为0-59。
    • value|date:"Y年m月j日  H时i分s秒"

5. 模板继承

模板继承和类的继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量。

父模板

如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。

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

子模板

标签extends:继承,写在子模板文件的第一行。

 {% block 名称 %}

预留区域,可以编写默认内容,也可以没有默认内容

 {% endblock 名称 %}

子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值。

 {% extends "父模板路径" %}

填充父模板中指定名称的预留区域。

{% block 名称 %}

实际填充内容

{{ block.super }}

用于获取父模板中block的内容

 {% endblock 名称 %}

二、Django使用jinja2模板

1. jinja2介绍

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

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

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

2. 安装jinja2模块

    pip install jinja2

3. Django配置jinja2

1. 在项目文件中创建 jinja2_env.py 文件

from jinja2 import Environment

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

    return env

2. 在settings.py文件

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',#修改1
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS':True,
        'OPTIONS':{
            'environment': 'jinja2_env.environment',# 修改2
            'context_processors':[
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

4. jinja2模板的使用绝大多数和Django自带模板一样

 5. 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 "哈哈"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值