教程 > django 教程 > 阅读:147

django 模板——迹忆客-ag捕鱼王app官网

django 实现了 python 和 html 分离的功能,python 控制视图,html 作为单纯的模板。为了将两者联系起来,django 依赖于 render 函数和 django 模板语言。在视图一节中,我们初步接触了模板。本节我们详细说一说模板的使用。

首先我们来看一下 render 函数的语法

render(request, templatepath, params)

这个函数需要三个参数 -

  • request - 初始请求。
  • 模板路径- 这是相对于项目 settings.py 变量中的 template_dirs 选项的路径。
  • 参数字典 - 包含模板中所需的所有变量的字典。可以创建此变量,也可以使用 locals() 传递视图中声明的所有局部变量。

django 模板语言 (dtl)

django 的模板引擎提供了一种迷你语言来定义应用程序的面向用户的层。

显示变量

在模板中使用{{variable}}这种形式定义一个变量。模板使用 render 函数的第三个参数中将变量替换为视图传递的变量值。让我们举个例子看一下

首先在 app 中新建一个 templates文件夹用来存放模板文件。然后新建一个 template.html 模板文件


    
    django - 迹忆客

欢迎访问 {{webname}}!

然后我们新建一个视图 template

from django.shortcuts import render
from django.http import httpresponse
def template(request):
    return render(request, "tempate.html", {"webname": "迹忆客"})

这里模板的路径需要在 settings.py 配置中进行配置,或者也可以在视图中定义绝对路径。这里我们选择在配置文件中配置模板存放路径

templates = [
    {
        'backend': 'django.template.backends.django.djangotemplates',
        'dirs': [os.path.join(base_dir, "app/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',
            ],
        },
    },
]

上面的 dirs 元组中定义的是模板的路径。

最后再定义一个路由

from django.urls import path, re_path
from . import views
urlpatterns = [
    path('hello/', views.hello),
    path('visit/', views.visit),
    re_path(r'article/(\w )', views.article),
    re_path(r'articles/(?p\d{2})/(?p\d{4})', views.articles),
    path('template/', views.template)
]

重启服务,浏览器访问 /app/template 结果如下

django 模板访问变量

如果传给变量的不是一个字符串,django 模板引擎将使用 __str__ 函数强制转换成字符串进行显示。除此之外,视图中的变量也可以是一个和python中一样的数据类型,访问方式也是一样的。例如传给视图一个对象,则可以使用 {{object.property}} 的方式访问对象的属性。 我们改造一下上面的视图和模板

修改模板文件 template.html


    
    django - 迹忆客

欢迎访问 {{webname}} !

今天是 {{today.month}}月{{today.day}}号

修改视图 template

def template(request):
    today = datetime.datetime.now().date()
    return render(request, "template.html", {"webname": "迹忆客", "today": today})

浏览器访问结果如下

django 模板对象变量


过滤器

通过使用过滤器,我们可以对模板中的变量的值进行修改。格式 {{var|filter}}。 其中 filter 可以是一些python系统函数及其对应的参数。例如

  • {{string|truncatewords:5}} - 此过滤器将截断字符串,因此您只会看到前 5 个单词。
  • {{string|lower}} - 将字符串转换为小写。

下面我们通过实际例子来加深印象

将字符串转换为大写

下面这个例子,将迹忆客的网址 jiyik.com 转换为大写显示

修改模板文件 template.html


    
    django - 迹忆客

欢迎访问 {{webname}} !

迹忆客网址:{{website|upper}}

今天是 {{today.month}}月{{today.day}}号

修改视图

def template(request):
    today = datetime.datetime.now().date()
    return render(request, "template.html", {"webname": "迹忆客", "today": today, "website": "jiyik.com"})

django 模板变量过滤器字符串大写

截断字符串

下面这个例子将迹忆客网址 jiyik.com 截出前5个字符显示

修改模板文件 template.html


    
    django - 迹忆客

欢迎访问 {{webname}} !

迹忆客网址:{{website|upper}}

截取字符串为:{{str|truncatewords:2}}

今天是 {{today.month}}月{{today.day}}号

视图 template

def template(request):
    today = datetime.datetime.now().date()
    return render(request, "template.html",
                  {"webname": "迹忆客", "today": today, "website": "jiyik.com", "str": "that is wonderful!"})

django 过滤器截断单词

注意,truncatewords 后面指定的数字 表示的是截取几个单词,而不是字符。 所以上面的例子显示的是 that is 而不是 th。


标签

在 django 模板中也支持很多的标签: if 条件、for 循环、模板继承等

if 条件

和使用 python写代码一样,在模板中也可以使用 if、else 和 elif。

修改 template.html 模板文件


    
    django - 迹忆客

欢迎访问 {{webname}} !

迹忆客网址:{{website|upper}}

今天是 {{today.month}}月{{today.day}}号

{% if today.day == 1 %} 今天是本月的第一天 {% elif today.day == 30 %} 今天是本月的最后一天 {% else %} 今天学习 django {% endif %}

django 模板条件语句

for 循环

除了可以使用if条件语句之外,还支持 for循环。使用方式就和在python中一样。

首先我们修改 template 视图

def template(request):
    today = datetime.datetime.now().date()
    daysofweek = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
    return render(request, "template.html",
                  {"webname": "迹忆客", "today": today, "days_of_week" : daysofweek, "website": "jiyik.com", "str": "that is wonderful!"})

然后是用 {%for%} 标签显示模板


    
    django - 迹忆客

欢迎访问 {{webname}} !

迹忆客网址:{{website|upper}}

今天是 {{today.month}}月{{today.day}}号

{% if today.day == 1 %} 今天是本月的第一天 {% elif today.day == 30 %} 今天是本月的最后一天 {% else %} 今天学习 django {% endif %}

{% for day in days_of_week %} {{day}} {% endfor %}

访问结果如下

django 模板for循环


块标记和继承标记

对于一个模板系统,如果没有模板继承的功能,那么这个模板系统是不玩这个的。因此我们在设计模板的时候,应该首先新建一个带有许多 block 块儿的主模板。然后再定义一些子模板,这些子模板去填充主模板中的block块儿。就像页面可能需要为所选选项卡添加特殊的 css样式 一样。

让我们来改造一下之前的template.html模板。 我们让其作为一个子模板,继承一个 主模板,这里我们将主模板新建为 main_template.html,其内容如下


    
    
        {% block title %}page title{% endblock %}
    
{% block content %}
body content
{% endblock %}

然后修改模板文件 template.html

{% extends "main_template.html" %}
{% block title %}django 继承主模板 - 迹忆客{% endblock %}
{% block content %}

欢迎访问 {{webname}} !

迹忆客网址:{{website|upper}}

今天是 {{today.month}}月{{today.day}}号

{% if today.day == 1 %} 今天是本月的第一天 {% elif today.day == 30 %} 今天是本月的最后一天 {% else %} 今天学习 django {% endif %}

{% for day in days_of_week %} {{day}} {% endfor %}

{% endblock %}

为了区分,这里我们对title进行了一下修改。访问结果如下

django 模板继承

通过上面的例子我们看到,在 template.html 中使用 {%extends%} 标签继承了主模板 main_template.html。然后 在子模板中定义的块 {% block title %} 和 {% block content %} 分别回去替换主模板中的相对应的块儿,这是根据 block 后面跟着的名称来判断的。子模板中的title去对应主模板中的title,content 去对应 content。

那么,如果说在子模板 template.html 中定义了一个块儿,而在主模板中没有对应的块儿怎么办。此时django 模板引擎就会忽略子模板中的块儿,不会将其渲染出来。例如子模板中的代码如下

{% extends "main_template.html" %}
{% block title %}django 继承主模板 - 迹忆客{% endblock %}
{% block content %}

欢迎访问 {{webname}} !

迹忆客网址:{{website|upper}}

今天是 {{today.month}}月{{today.day}}号

{% if today.day == 1 %} 今天是本月的第一天 {% elif today.day == 30 %} 今天是本月的最后一天 {% else %} 今天学习 django {% endif %}

{% for day in days_of_week %} {{day}} {% endfor %}

{% endblock %} {% block othercontent %}

这是另一个块

{% endblock %}

我们定义了一个 othercontent块儿,因为在主模板中没有对应的占位块。所以这也就被模板引擎忽略了。 访问结果没有任何变化

那反过来,在主模板中定义了一个占位块,但是在子模板中没有相对应的块儿,那结果有点儿不一样。django 模板引擎会将该块儿的内容渲染出来。例如我们的主模板定义如下


    
    
        {% block title %}page title{% endblock %}
    
{% block content %}
body content
{% endblock %}
{% block leftcontent %}
leftcontent block
{% endblock %}

这里在主模板中定义了一个 leftcontent块儿。但是子模板中并没有定义相对应的块儿内容。访问结果如下

django 模板未对应块儿处理

comment 标记

comment 标记起注释的作用。和html的注释不同,它们不会出现在 html 页面中。它可用于文档或仅注释一行代码。虽然 html 的注释也不会在页面上显示,但是查看源码的时候还是能查看到的,在访问的时候也是在一定程度上占用了流量的。

例如,template.html 模板引擎修改如下

{% extends "main_template.html" %}
{% block title %}django 继承主模板 - 迹忆客{% endblock %}
{% block content %}

欢迎访问 {{webname}} !

迹忆客网址:{{website|upper}}

今天是 {{today.month}}月{{today.day}}号

{% if today.day == 1 %} 今天是本月的第一天 {% elif today.day == 30 %} 今天是本月的最后一天 {% else %} 今天学习 django {% endif %}

{% for day in days_of_week %} {{day}} {% endfor %} {% comment %} 这是 django 模板引擎中的注释 {% endcomment %}

{% endblock %}

在浏览器中访问查看源码结果如下

django 模板注释

我们可以看到,django 模板中的注释并没有显示在浏览器查看的源码中,相反html中的注释是显示在前端的。因此,我们在开发过程中尽量使用 django 模板引擎中的注释方式,在一定程度上可以节流。

查看笔记

扫码一下
查看教程更方便
网站地图