Django模板标签

Posted 礁之

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django模板标签相关的知识,希望对你有一定的参考价值。

文章目录


此文章参考菜鸟教程:Django 模板 | 菜鸟教程 (runoob.com)
Django版本:

>>> django.VERSION  
(4, 1, 0, 'final', 0)

PS:基于前几章的进度进行修改

一、使用Django模板修改页面

  • 上一章中,直接使用了index_test.py添加\\修改了资源页面,这次使用模板来添加资源页面\\修改页面

  • 先来看index_test.py文件,可以看到使用了模块django.http.HttpResponse()来输出指定的信息:

#-*- coding: utf-8 -*-
from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello World!!!")
  • 而上面的这种方式会将数据和视图混合在一起,不符合Django中的MTC思想,所以我们可以使用模板来输出数据:

  • 根据上一章节中的项目结构,现在在helloworld项目目录下创建templates目录,然后创建test.html文件

  • 现在的目录结构如下:

  • 下面是test.html模板文件的内容:

<h1> hello </h1>  #这里是变量,使用了双括号
  • 下面向Django说明模板文件路径,修改helloworld容器目录下的settings.py文件:
import os  				#导入os模块
。。。。。。
TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],             #修改DIRS,说明模板文件的路径,BASE_DIR是manage.py文件所在的路径
        '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',
            ],
        ,
    ,
]
  • 现在修改index_test.pyurls.py,增加一个新的对象,用于向模板提交数据

render()方法参数:

render(request, template_name, context=None, content_type=None, status=None, using=None)
  • request:必要参数,浏览器向服务器发送的请求对象,包含用户信息、请求内容、请求方式等
  • template_name:必要参数,设置模板文件名,用于生成网页内容
  • context:对模板上下文即模板变量赋值,以字典格式表示,默认情况下是一个空字典
  • content_type:响应内容的数据格式,一般情况下使用默认值即可
  • status:HTTP状态码,默认是200
  • using:设置模板引擎,用于解析模板文件、生成网页内容等
- index_test.py
#-*- coding: utf-8 -*-
from django.shortcuts import render

def hello(request):
    contest = 
    contest['hello'] = 'Hello World!!!'
    return render(request,'test.html',contest)   #指定模板文件
- urls.py
#-*- coding: utf-8 -*-
from django.urls import path

from . import index_test

urlpatterns = [
    path('hello/',index_test.hello),
]
  • 可以看到,我们这里使用了render来代替之前使用的HttpResponserender使用了一个字典contest作为参数,contest字典中元素的键值hello对应了test.html模板文件中 hello 变量

  • 再次进行访问:

  • 可以看到已经替换页面了,现在已经完成了使用模板来输出数据,实现数据与视图分离

二、Django模板标签

  • 经过上面的实践,下面来看一下Django模板中常用的语法规则

- 变量

  • 模板语法:
视图view:"HTML变量名":"views变量名"
HTML: 变量名 
  • 可以看到其实也就是字典,跟上面那个一样

  • 下面来看案例:

    • 现在修改视图文件index_test.py文件,下面是变量和字典的写法,可以看到思路其实是一样的:
    - 变量
    # -*- coding: utf-8 -*-
    from django.shortcuts import render
    
    def Hello(request):
        test_view = "测试"
        hello_view = "你好"
        return render(request,'test.html',"test":test_view,"hello":hello_view)
    
    • 修改templates目录下的test.html文件:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>   #页面名称
    </head>
    <body>
        <p> test </p>      #导入两个变量
        <h1> hello </h1>
    </body>
    </html>
    
    • 再次访问,成功修改!

- 列表

  • templates中的test.html文件,可以使用.索引下标取出相对应的元素

  • 下面来看案例:

    • 修改视图文件index_test.py,相当于是把字典的值换成列表:
    # -*- coding: utf-8 -*-
    from django.shortcuts import render
    
    def Hello(request):
        test_view = ["测试1号","测试2号","测试3号"]
        return render(request,'test.html',"test":test_view)
    
    • 修改test.html文件:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <p> test </p>
        <p> test.0 </p>           #配合 . 可以根据列表下标调用元素
        <p> test.2 </p>
    </body>
    </html>
    
    • 查看页面:

- 字典

  • templates中的test.html文件,可以使用.键取出相对应的元素

  • 下面来看案例:

    • 修改视图文件index_test.py
    # -*- coding: utf-8 -*-
    from django.shortcuts import render
    
    def Hello(request):
        test_view = "name":"测试","age":22
        return render(request,'test.html',"test":test_view)
    
    • 修改test.html文件:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <p> test </p>
        <h1> test.name </h1>
        <h2> test.age </h2>
    </body>
    </html>
    
    • 查看页面:

- 过滤器

  • 模板语法:
 变量名 | 过滤器:可选参数 
  • 模板过滤器可以在变量被显示前修改它,过滤器使用管道字符:
 name | lower     #文档大写文本会转换成小写
  • 过滤管道可以被套接,也就是说一个过滤器的输出可以作为下一个过滤器的输入,与linux的管道符是一样的
 my_list | first | upper     #取出第一个值并转换成大写
  • 有些过滤器有参数,过滤器的参数跟随冒号:之后并且总是以双引号""包含
 bio | truncatewords:"30"    #显示bio变量的前30个词
  • 其他过滤器

    • addslashes:添加反斜杠到任何反斜杠、单引号或者双引号前面
    • date:按照指定的格式字符串参数格式化date或者datetime对象
     pub_date | date:"F J, Y"
    
    • length:返回变量的长度

1、default

  • default为变量提供一个默认值,如果视图传输的变量的布尔值是False,那么就会使用指定的默认值,以下的值的布尔值都是False

    0  
    0.0  
    False  
    0j  
    ""  
    [] 
    ()  
    set()  
      
    None
    
  • 下面来看案例:

    • 修改index_test.py视图文件:
    # -*- coding: utf-8 -*-
    from django.shortcuts import render
    
    def Hello(request):
        test_view = "name":"zhangsan","time":0
        return render(request,'test.html',"test":test_view)
    
    • 修改test.html文件:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <p> test </p>
        <h1> test.time | default:"测试!!" </h1>  #变量的布尔值为False则变量值为 测试!!
    </body>
    </html>
    
    • 访问页面

2、length

  • length可以返回对象的长度,一般适用于字符串和列表,字典返回的是键值对的数量,集合返回的是去重后的长度

  • 下面来看案例:

    • 修改index_test.py视图文件
    #-*- coding: utf-8 -*-
    from django.shortcuts import render
    
    def hello(request):
        test_view = "测试"
        return render(request,"test.html","test":test_view)
    
    • 修改test.html文件
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <p> test | length </p>
    </body>
    </html>
    
    • 访问页面

3、filesizeformat

  • filesizeformat会以更人性化的方式显示文件的大小,其实就是加上单位,如KB、MB等

  • 字典返回的是键值对的数量,集合返回的是去重后的长度,下面来看案例:

    • 修改index_test.py视图文件
    #-*- coding: utf-8 -*-
    from django.shortcuts import render
    
    def hello(request):
        test_view = 10240
        return render(request,"test.html","test":test_view)
    
    • 修改test.py文件
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <p> test | filesizeformat </p>
    </body>
    </html>
    
    • 访问页面

4、date

  • date会根据指定格式对一个日期变量进行格式化,格式Y-m-d H:i:s返回年-月-日 时:分:秒的格式时间

  • 下面来看案例:

    • 修改index_test.py视图文件
    #-*- coding: utf-8 -*-
    from django.shortcuts import render
    import datetime
    
    
    def hello(request):
        test_view = datetime.datetime.now()
        return render(request,"test.html","test":test_view)
    
    • 修改test.py文件
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <p> test | date:"Y-m-d H:i" </p>
    </body>
    </html>
    
    • 访问页面

5、truncatechars

  • truncatechars可以截断字符串,如果字符串包含的字符总数多于指定的字符数量,那么多出的部分会被截断,只剩余指定数量的字符

  • 下面来看案例:

    • 修改index_test.py视图文件
    #-*- coding: utf-8 -*-
    from django.shortcuts import render
    
    
    def hello(request):
        test_view = "测试!!案例??"
        return render(request,"test.html","test":test_view)
    
    • 修改test.py文件
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <p> test | truncatechars:4 </p>
    </body>
    </html>
    
    • 访问页面

6、safe

  • Django 会自动对视图文件传到HTML文件中的标签语法进行转义,令其语义失效。而加 safe 过滤器是告诉 Django 该数据是安全的,不必对其进行转义,可以让该数据语义生效。

  • safe会将字符串标记为安全,不需要转移,但是需要保证视图文件传过来的数据是绝对安全,才能使用safe

  • safe和后端视图文件的mark_safe效果相同

  • 下面来看案例

    • 修改index_test.py视图文件
    #-*- coding: utf-8 -*-
    from django.shortcuts import render
    
    
    def hello(request):
        test_view = "<a href='https://www.baidu.com/'>点击跳转</a>"
        return render(request,"test.html","test":test_view)
    
    • 修改test.py文件,先看不加safe的
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <p> test </p>
    </body>
    </html>
    
    • 访问

    • 现在加上safe
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <p> test | safe </p>
    </body>
    </html>
    
    • 访问页面,可以进行跳转

- if/else标签

  • if/else基本语法格式:
% if condition %
     ... display
% endif %% if condition1 %
   ... display 1
% elif condition2 %
   ... display 2
% else %
   ... display 3
% endif %
  • 可以根据条件判断是否输出,并且if/else支持嵌套

  • % if %标签接收andornot等关键字对多个变量进行判断,这点和python基础的流程控制是一样的

  • 下面来看案例:

    • 修改index_test.py视图文件
    #-*- coding: utf-8 -*-
    from django.shortcuts import render
    
    
    def hello(request):
        test_view = 95
        return render(request,"test.html","test":test_view)
    
    • 修改test.py文件
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
    %if test > 90 and test <= 100 %
    优秀
    % elif test > 60 and test <= 90 %
    合格
    % else %
    一边玩去~
    % endif %
    </body>
    </html>
    
    • 访问页面

- for标签