Django的模板的应用

一、模版引擎的介绍和选择

Django模板系统的主要作用是将动态内容嵌入到静态HTML页面中。它允许开发者定义占位符,这些占位符在渲染模板时会被实际的数据替换,从而生成动态的网页内容。

官方提供了两种模板引擎,一种是DTL ,一种是Jinja2

  1. Django模板语言(DTL)
    • 这是Django内置的模板语言,它提供了一套简单而强大的语法,用于在HTML模板中插入动态内容。
    • DTL支持变量、标签和过滤器等功能,使得开发者可以轻松地实现数据的动态渲染和页面的布局控制。
  2. Jinja2
    • Jinja2是当前Python社区中非常流行的另一个模板语言,它也被Django支持。
    • Jinja2的设计哲学与Django模板语言有所不同,它提供了更强大的自动HTML转义系统、沙箱执行模式以及高效的执行效率等特性。

二、配置模板

在项目的setting文件中,未配置模板的TEMPLATES是这样的:

python 复制代码
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
            ],
        },
    },
]

参数说明:

BACKEND:指定模板引擎的后端。

DIRS:设置模板文件的搜索路径。

APP_DIRS:一个布尔值,指定Django是否应该在每个应用的templates目录下查找模板文件。

每种模板引擎后端都定义了一个惯用的名称作为应用内部存放模板的子目录名称,

如:DTL-tmplates目录,Jinja2-jinja2目录

OPTIONS:一个字典,包含了模板引擎的一些额外选项。

1、配置template模板

python 复制代码
TEMPLATES = [#多个页面模板引擎加载顺序由上至下
    {
        #表示配置哪一种模版,默认配置Django自带的模版DTL
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        #存放模版的目录位置
        'DIRS': [os.path.join(BASE_DIR,'templates')]
        ,
        'APP_DIRS': True,#模版应用范围: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、配置jinja2模板

如果想同时用这两种,需要用逗号分隔两种模板的配置:

python 复制代码
TEMPLATES = [#多个页面模板引擎加载顺序由上至下
    {
        #表示配置哪一种模版,默认配置Django自带的模版DTL
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        #存放模版的目录位置
        'DIRS': [os.path.join(BASE_DIR,'templates')]
        ,
        'APP_DIRS': True,#模版应用范围: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',
            ],
        },
    },
    #配置第二种模版
    {
        #表示配置哪一种模版,默认配置Django自带的模版DTL
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        #存放模版的目录位置
        'DIRS': [os.path.join(BASE_DIR,'jinja2')]
    }
]

你要确保DIRS的目录存在,即要存在jinja2目录。

配置完template和jinja2目录都可以存放html文件模板了,当配置了两种模板,会从上至下应用。

三、模板变量的使用

语法结构:{{variable}}

模板变量使用的案例在主页的render_to_string函数和render函数文章中

如果变量是一个class类,在模板文件中可以直接打点调用类中的方法

四、模板标签

语法结构 :{% tag %}

1、循环标签

循环list语法结构

{% for item in data_list %}

<li>内容</li>

{% empty %}

<li>暂无内容</li>

{% endfor %}

循环dict语法结构

{% for key,value in data.items %}

{{key}}:{{value}}

{% endfor %}

重复循环(循环中再循环)

{%cycle 'row1''row2'%}

forloop变量:

forloop.first(布尔值,第一次循环时为真),forloop.last(布尔值,最后一次循环时为真),forloop.counter0(整型计数器,记录循环次数,第一次从0开始),forloop.counter(整型计数器,记录循环次数,第一次从1开始)

案例

例如,在视图中有这样一个函数:

python 复制代码
def tag(request):
    list_user=[
        {'name':'黑梦','age':20},
        {'name':'贤者','age':19,'sex':"女"}
    ]
    return render(request, 'tag.html', {'list_user':list_user})

使用的是tag.html模板文件,将list_user数据传入到模板中。

tag.html内容:

html 复制代码
<h1>用户列表</h1>
{% for user in list_user %}
    <p class="{% cycle 'row1' 'row2'%}">第{{ forloop.counter }}个用户信息</p>
    {% for key,value in user.items %}
        {{ key }} - {{ value }}
    {% endfor %}
    {% empty %}
    暂无用户信息
{% endfor %}

上述代码最外层循环实现了遍历了list_user内的每一个元素,第二层for循环实现遍历每个字典元素内的key/value元素。

style标签内容:

html 复制代码
<style>
        .row1{
            color:palevioletred;
        }
        .row2{
            color: #97db6c;
        }
    </style>

那么通过{% cycle 'row1' 'row2'%}循环实现效果为:第一次循环class值为row1,第二次循环为row2,如果有第三次循环,class值将从row1开始。

2、判断标签

语法结构

{% if condition_a %}

满足A的条件

{% elif condition_b %}

满足B的条件

{% else %}

都不满足

{% endif %}
逻辑控制

and,or ,==,!= ,>,< ,>=,<= ,in,not in ,is

案例

在模板文件中有如下标签语言:

html 复制代码
{% if 1 > 2 %}
    不可能
{% elif 1 < 2 %}
对滴
{% else %}
    更不可能
{% endif %}

最后页面显示:

3、url解析

语法:

DTL :{%url 'url_name ' params %}

Jinja2 :{{url_for('index ')}}

例如,在static文件夹下有一个图片名为1.jpg,在模板文件中可以这么写:

html 复制代码
{% load static %}
<img src="{% static '1.jpg' %}" alt="大美女" width="100px" height="100px">

首先加载static目录。

4、模板注释

语法结构

(1){#注释内容#}

(2){% comment "注释内容"%}

<p>HTML内容{{create_date}}</p>

{%endcomment%}

与html传统注释<!--注释-->区别:在页面源代码中传统的注释可以看见,而标签的注释看不见。

相关推荐
Seven9716 分钟前
【设计模式】从火车站卖票看代理模式的实际应用
java·后端·设计模式
我的运维人生17 分钟前
从零开始:使用 Python 实现机器学习的基础与实践
开发语言·python·机器学习
python收藏家21 分钟前
Python | 机器学习中最常用的超参数及使用示例
python·机器学习
测试的菜鸟27 分钟前
[pytest] 配置
python·pytest
开开心心就好41 分钟前
能一站式搞定远程操作需求的实用工具
java·服务器·python·spring·pdf·电脑·软件
蔗理苦42 分钟前
2025-03-10 吴恩达机器学习1——机器学习概述
人工智能·python·机器学习
IT古董44 分钟前
【漫话机器学习系列】130.主成分(Principal Components)
人工智能·python·机器学习
m0_748257461 小时前
Python大数据可视化:基于spark的短视频推荐系统的设计与实现_django+spider
python·spark·django
冬天vs不冷1 小时前
Spring组件实例化扩展点:InstantiationAwareBeanPostProcessor
java·后端·spring