Python(Web时代)—— Django的模板

介绍

作为一个网络框架,Django 需要一种方便的方式来动态生成 HTML。最常见的方法是依靠模板。一个模板包含了所需 HTML 输出的静态部分,以及一些特殊的语法,描述了如何插入动态内容。目前流行的 Web 框架基本都采用 MVC 的架构,而 Django 在这个架构基础上做了一点改变,即 MTV 框架,这里的 T 就是今天我们要讲的 Django 的模板系统( Template )。

一个 Django 项目可以配置一个或多个模板引擎(如果你不使用模板,甚至可以不配置模板)。Django 默认内置了一个模板系统 DTL( Django template language ),在一般的项目开发中足够应用了

Django 模板是使用 Django 模板语言标记的一个文本文档或Python字符串。模板引擎可以识别和解释一些构造。主要是变量和标签。

模板主要包含两块内容:

  • HTML的静态内容

  • 动态插入的内容(Django 模板语言,简写 DTL,定义在 django.template 包中)

由 startproject 命令生成的 settings.py 定义关于模板的值:

  • DIRS 定义了一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件。

  • APP_DIRS 告诉模板引擎是否应该在每个已安装的应用中查找模板。

模板的使用

Django 模板系统其实是 Python 的一个库,使用模板通过以下两种方法

  • 第一步:通过Template对象,传入一个字符串或者模板的文本文件

  • 第二步:调用Template对象的 render() 方法,然后传入相应的动态变量

以下我们继续以之前的TestDjango项目下的 score应用为例,进入到score应用的 views.py文件中,修改如下

方式一:采用字符串模板

# score/views.py

# 导入模板相关库
from django.template import Template, Context


def index(request):
    # 定义模板
    t = Template('你好<h1 style="color:red"> {
   
   { name }}</h1>, 这是一个评分系统')
    # 定义传入对象
    c = Context({'name': '张三'})
    # 返回渲染模板

修改完成后,通过命令 python manage.py runserver 127.0.0.1:8080 启动服务,然后访问该URL:http://127.0.0.1:8080/score/  ,就能看到如下结果

图片

方式二:使用模板文件(在应用的目录下创建 templates 目录,程序会自动在该目录下寻找模板。)

注:添加完方法后,记得在urls.py中加上路径

a.html 模板文件

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
你好<h1 style="color:red"> {
   
   { name }}</h1>, 这是一个评分系统
</body>
</html>

​​​​​​

目录结构

图片

方式三:使用模板文件(在项目的根目录下创建 templates 目录,配置 DIRS 值

第一步:在项目的根目录下创建 templates 目录

图片

第二步:修改项目目录下,TestProject/settings.py 配置文件,在配置文件找到 TEMPLATES 对象,并在修改其中 DIRS 的配置路径如下:

图片

# 注:os 需要先导入才能使用
import os
'DIRS': [os.path.join(BASE_DIR, 'templates')],     # 修改模板配置路径,

第三步:修改score下的views.py文件,添加方法,并在urls.py中添加相应路径

def template4(request):
    c = {'name': "张三"}
    return render(request, 'd.html', c)

​​​​​最后访问页面

图片

模板的语法

条件判断语法

{% if 条件 %}
 #   满足条件展示内容
 {% endif %}

 # 或者

 {% if 条件1 %}
 #   满足条件1展示
 {% elif 条件2 %}
 #   满足条件2展示
 {% else %}
 #   不满足条件1条件2的展示
 {% endif %}

  # 或者多条件判断
 {% if 变量1 and 变量2 %}
 {% endif %}

 {% if 变量1 or 变量2 %}
 {% endif %}

循环语法

 {% for x in xx %}

 {% endfor %}

比较语法

# ifequal/ifnotequal 语法用于更直接的比较两个变量是否相等
 {% ifequal user '张三' %}

 {% endifequal %}

 # 或者

 {% ifnotequal user '张三' %}

 {% endifnotequal %}

模板过滤器

过滤器使用管道字符 | 。另外过滤管道可以被套接,即一个过滤器管道的输出又可以作为下一个管道的输入

{
   
   { 变量 | 过滤器 }}

示例

# 表示将变量 name 的值变为小写输出
{
   
   { name|lower }}  

# 将变量第一个元素转化为大写字母
{
   
   { name|first|upper }}

模板继承

模板继承可以减少页面内容的重复定义,实现页面内容的重用。

典型应用:网站的头部、尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义

示例: 在templates中创建一个 common.html 文件用于复用

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
    <h1>你好,这是公共部分</h1>
    {% block mainbody %}

    {% endblock %}
</body>
</html>

再创建一个 b.html模板文件,继承common.html

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
    <h1>你好,这是公共部分</h1>
    {% block mainbody %}

    {% endblock %}
</body>
</html>

最后修改score应用的views.py文件

# score/views.py

def template3(request):
    c = {'name': "张三"}
    return render(request, 'b.html', c)

修改完成,最后通过访问 URL http://127.0.0.1:8080/score/template3 就能看到我们刚修改完的页面

图片

注:

  • block 标签:在父模板中预留区域,在子模板中填充

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

程序猿与投资生活实录已改名为  程序猿知秋,WX 公众号同款,欢迎关注!! 

猜你喜欢

转载自blog.csdn.net/qq_25702235/article/details/132801132