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

相关推荐
fish_study_csdn4 小时前
pytest 技术总结
开发语言·python·pytest
柏油5 小时前
MySQL InnoDB 行锁
数据库·后端·mysql
咖啡调调。5 小时前
使用Django框架表单
后端·python·django
BO_S__5 小时前
python调用ffmpeg对截取视频片段,可批量处理
python·ffmpeg·音视频
白泽talk5 小时前
2个小时1w字| React & Golang 全栈微服务实战
前端·后端·微服务
摆烂工程师5 小时前
全网最详细的5分钟快速申请一个国际 “edu教育邮箱” 的保姆级教程!
前端·后端·程序员
一只叫煤球的猫5 小时前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
就叫飞六吧5 小时前
如何判断你的PyTorch是GPU版还是CPU版?
人工智能·pytorch·python
Asthenia04125 小时前
HTTP调用超时与重试问题分析
后端
颇有几分姿色6 小时前
Spring Boot 读取配置文件的几种方式
java·spring boot·后端