django系统模板

news2024/11/29 8:49:02

【一】引子

来看一段代码

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

直接把HTML页面嵌套在视图函数里返回给浏览器并不是一个好主意;

原因:

  • 对页面设计进行的任何改变都必须对 Python 代码进行相应的修改,牵一发而动全身;
  • Python 代码编写和 HTML 设计是两项不同的工作,前端开发和后端开发无非 并行;

​ 基于这些原因,将HTML页面的设计和后端逻辑设计分离,会更简洁、容易维护开发我们的WEB应用。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式。这个就是DJango模板系统的意义所在。

【二】模板语法的传值

  • {{ }} : 变量相关
  • {% %} : 逻辑相关

重要事项:

  • 变量语法:在模板中使用变量时,使用双花括号{{ }}将变量包围起来,例如{{ variable_name }}
  • 变量名称:变量名称由字母、数字、下划线和点号组成,不能以数字开头。
  • 变量上下文:变量的值来自于视图函数中的上下文(context),在模板中可以直接访问视图函数中传递的变量。
  • 对象属性:如果变量是一个对象,可以使用点号语法来访问对象的属性,例如{{ object.attribute }}
  • 字典和列表:可以使用方括号语法来访问字典和列表中的元素,例如{{ my_dict["key"] }}{{ my_list[0] }}
  • 过滤器:可以使用管道符号|将变量与过滤器组合,以修改变量的显示方式,例如{{ variable|filter_name }}
  • 默认值:可以通过在变量后面添加default过滤器来提供默认值,以防变量不存在或为空,例如{{ variable|default:"N/A" }}

【1】 变量

image-20240301215316439

(1)传值

  • 在Django的模板语言中按此语法使用:
    • {{ 变量名 }}。
  • 当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。
  • 变量的命名包括任何字母数字以及下划线 (“_”)的组合。
  • 变量名称中不能有空格或标点符号。

(2)取值

  • 点(.)在模板语言中有特殊的含义。
    • 当模版系统遇到点(“.”),它将以这样的顺序查询:
      • 字典查询(Dictionary lookup)
      • 属性或方法查询(Attribute or method lookup)
      • 数字索引查询(Numeric index lookup)

总结:

​ 通过在模板中使用双花括号{{ }}来传递变量,并使用点.来取值,您可以在模板中动态地显示来自视图函数的数据。

注意事项

  • 如果计算结果的值是可调用的,它将被无参数的调用。 调用的结果将成为模版的值。
  • 如果使用的变量不存在, 模版系统将插入 string_if_invalid 选项的值, 它被默认设置为’’ (空字符串) 。

简单的示例:

以下是Django模板系统中的八大数据类型的简单表示,并包括了urls.py路由层、views.py视图层和前端HTML的示例:

  1. 字符串(String):

    • urls.py:无需特殊处理。
    • views.py:将字符串传递给模板。
    • HTML:直接在模板中使用变量。

    示例:

    # urls.py
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('hello/', views.hello_view, name='hello'),
    ]
    
    # views.py
    from django.shortcuts import render
    
    def hello_view(request):
        greeting = "Hello, World!"
        return render(request, 'hello.html', {'greeting': greeting})
    
    <!-- hello.html -->
    <h1>{{ greeting }}</h1>
    
  2. 整数(Integer):

    • urls.py:无需特殊处理。
    • views.py:将整数传递给模板。
    • HTML:直接在模板中使用变量。
  3. 浮点数(Float):

    • urls.py:无需特殊处理。
    • views.py:将浮点数传递给模板。
    • HTML:直接在模板中使用变量。
  4. 列表(List):

    • urls.py:无需特殊处理。
    • views.py:将列表传递给模板。
    • HTML:使用循环在模板中遍历列表元素。
  5. 字典(Dictionary):

    • urls.py:无需特殊处理。
    • views.py:将字典传递给模板。
    • HTML:使用点号语法在模板中访问字典的键值对。
  6. 元组(Tuple):

    • urls.py:无需特殊处理。
    • views.py:将元组传递给模板。
    • HTML:直接在模板中使用变量。
  7. 对象(Object):

    • urls.py:无需特殊处理。
    • views.py:将对象传递给模板。
    • HTML:使用点号语法在模板中访问对象的属性或方法。
  8. 布尔值(Boolean):

    • urls.py:无需特殊处理。
    • views.py:将布尔值传递给模板。
    • HTML:使用条件语句在模板中根据布尔值显示不同的内容。

具体示例:

# urls.py文件
path('index/',views.index)
# views.py
def index(request):
    # 模板语法可以传递的后端python的数据类型
    int = 123
    float = 123.02
    str_ = '老子明天不上班'
    bool = True
    list = ['一号技师','二号技师','三号技师']
    tuple = (123,456,789,741,852,963)
    dict = {'username':'xiaoshuai','age': 18,'slary': 10000}
    set = {123,'数字','小明'}

    return render(request, 'index.html',locals())
<!-- 在index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板层传值</title>
</head>
<body>
{{ int }} <br>
{{ float }}<br>
{{ str }}<br>
{{ bool }}<br>
{{ list }}<br>
{{ tuple }}<br>
{{ dict }}<br>
{{ set }}<br>
</body>
</html>

image-20240302193452359

  • 跟进上述来看跟保证输出成功的参数就是locals()
return render(request, 'index.html',locals())

值得注意的是:

​ 函数也能

  • def bai():
        x = 6
        y = 7
        z = x + y
        return z
    
  • 传递函数名会自动加括号调用 但是模板语法不支持给函数额外的参数:{{ bai }}

  • 传类名的时候也会自动加括号调用(实例化){{ Myclass }} ,{{ obj }}

  • 内部能够自动判断出当前的变量名是否可以加括号电影 如果可以就会自动执行 这针对是函数名跟类名。

  • {{ obj.get_bai }} <br>
    {{ obj.get_func }} <br>
    {{ obj.get_class }} <br>
    
  • 对象被展示到html页面上 就类似于执行了打印操作也会触发__self__方法

image-20240302194115064

    class Myclass(object):
        def get_bai(self):
            return 'sorry get_bai'
        @staticmethod
        def get_func():
            return 'sorry get_func'
        @classmethod
        def get_class(cls):
            return 'sorry clsssss'

        def __str__(self):
            return '也可以被执行'
    obj = Myclass()
    return render(request, 'index.html',locals())

image-20240302200912401

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

取值

  • 在Django模板语法的取值, 是固定的格式 只能采取句点号 ( . )
<p> {{ dict.hobby.1 }}</p>
<p>{{ list.0 }}</p>
<p>{{ tuple.4 }}</p>
<p>{{ set.2 }}</p>
  • 即可以点健也可以点索引, 还可以两者混用。

【三】过滤器

【1】过滤器

  • 在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

(1)过滤器的语法

  • {{ value|filter_name:参数 }}
  • {{ 数据|过滤器:参数 }}
  • 使用管道符"|"来应用过滤器。
  • 例如:
    • {{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。
    • lower在这里的作用是将文本全都变成小写。

(2)注意事项

  • 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
  • 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
  • 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
  • |左右没有空格!没有空格!没有空格!

Django的模板语言中提供了大约六十个内置过滤器。

【2】语法

{{数据|过滤器:参数}}

【3】Django中实战使用——常用的过滤器:

①项目目录下的views.py文件:

from django.shortcuts import render
from django.http import HttpResponse


from datetime import datetime
def index(request):
    test="THIS IS A LIST!"
    list=["A","B","C","D","E"]
    data={
        'test':test,
        'xx':'',
        'num1':1,
        'num2':2,
        'list':list,
        'now':datetime.now(),
        'html':'<h1>hello django!!!</h1>',
        'float':3.1415926
    }
    return render(request, "index.html", data)

②项目目录下templates模板文件夹下的模板文件index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试!</title>
</head>
<body>

{#没做处理的变量:#}
{{ test }}<br>

{#设置了默认值的变量  在这个值被django认为是False的时候会使用此默认值。比如:空字符串,None。#}
{{ xx|default:'xxxxx' }}<br>

{#设置了只有为None时才使用默认值的变量#}
{{ xx|default_if_none:'aaaaa'}}<br>

{#变为小写后的变量#}
{{ test|lower }}<br>

{#先变为小写再将首字母大写后的变量#}
{{ test|lower|capfirst }}<br>

{#两个数字变量相加   add:字符串相加,数字相加,列表相加,如果失败,将会返回一个空字符串#}
{{ num1|add:num2 }}<br>

{#两个字符串变量相加#}
{{ test|add:xx }}<br>

{#列表变量的第一个元素#}
{{ list|first }}<br>

{#列表变量的最后一个元素#}
{{ list|last }}<br>

{#默认的data日期时间格式#}
{{ now|date }}<br>
{#默认的time时间格式#}
{{ now|time }}<br>
{#这是data过滤器的年月日24小时制时间格式#}
{{ now|date:'Y/m/d/H:i:s' }}<br>
{#这是time过滤器的时分秒12小时制时间格式#}
{{ now|time:'h:i:s' }}<br>

{#这是字符串的join方法  跟python中join一样的用法#}
{{ list|join:'oooo' }}<br>

{#这是字符串的长度方法#}
{{ test|length }}<br>

{#这是列表的长度是否为4#}
{{ list|length_is:4 }}<br>

{#下面这俩有xxx.html类型的,针对html,截断标签中的字符,而不会截断标签#}
{#这是字符串只显示4个字符,其余省略(但是占3位)#}
{{ test|truncatechars:7 }}<br>
{#这是字符串只显示2个单词,其余省略(不占位)#}
{{ test|truncatewords:2 }}<br>

{#这是字符串的切片#}
{{ test|slice:'1:4' }}<br>

{#这是列表的切片#}
{{ list|slice:'2' }}<br>

{#这是含html标签的字符串#}
{{ html }}<br>

{#这是去掉字符串中的html标签#}
{{ html|striptags }}<br>

{#这是关掉自动转义,使字符串中html标签生效#}
{{ html|safe }}<br>

{#这是没做处理的小数#}
{{ float }}<br>
{#这是保留了一位小数#}
{{ float|floatformat }}<br>
{#这是保留了两位小数#}
{{ float|floatformat:'2' }}

</body>
</html>

【4】日期格式化(date)

(1)语法

  • 格式化
{{ value|date:"Y-m-d H:i:s"}}
  • 可用的参数:
格式化字符描述示例输出
a'a.m.''p.m.'(请注意,这与PHP的输出略有不同,因为这包括符合Associated Press风格的期间)'a.m.'
A'AM''PM''AM'
b月,文字,3个字母,小写。'jan'
B未实现。
cISO 8601格式。 (注意:与其他格式化程序不同,例如“Z”,“O”或“r”,如果值为naive datetime,则“c”格式化程序不会添加时区偏移量(请参阅datetime.tzinfo) 。2008-01-02T10:30:00.000123+02:002008-01-02T10:30:00.000123如果datetime是天真的
d月的日子,带前导零的2位数字。'01''31'
D一周中的文字,3个字母。“星期五”
e时区名称 可能是任何格式,或者可能返回一个空字符串,具体取决于datetime。'''GMT''-500''US/Eastern'
E月份,特定地区的替代表示通常用于长日期表示。'listopada'(对于波兰语区域,而不是'Listopad'
f时间,在12小时的小时和分钟内,如果它们为零,则分钟停留。 专有扩展。'1''1:30'
F月,文,长。'一月'
g小时,12小时格式,无前导零。'1''12'
G小时,24小时格式,无前导零。'0''23'
h小时,12小时格式。'01''12'
H小时,24小时格式。'00''23'
i分钟。'00''59'
I夏令时间,无论是否生效。'1''0'
j没有前导零的月份的日子。'1''31'
l星期几,文字长。'星期五'
L布尔值是否是一个闰年。TrueFalse
m月,2位数字带前导零。'01''12'
M月,文字,3个字母。“扬”
n月无前导零。'1''12'
N美联社风格的月份缩写。 专有扩展。'Jan.''Feb.''March''May'
oISO-8601周编号,对应于使用闰年的ISO-8601周数(W)。 对于更常见的年份格式,请参见Y。'1999年'
O与格林威治时间的差异在几小时内。'+0200'
P时间为12小时,分钟和’a.m。'/‘p.m。’,如果为零,分钟停留,特殊情况下的字符串“午夜”和“中午”。 专有扩展。'1 am''1:30 pm' / t3>,'midnight','noon','12:30 pm' / T10>
rRFC 5322格式化日期。'Thu, 21 Dec 2000 16:01:07 +0200'
s秒,带前导零的2位数字。'00''59'
S一个月的英文序数后缀,2个字符。'st''nd''rd''th'
t给定月份的天数。28 to 31
T本机的时区。'EST''MDT'
u微秒。000000 to 999999
U自Unix Epoch以来的二分之一(1970年1月1日00:00:00 UTC)。
w星期几,数字无前导零。'0'(星期日)至'6'(星期六)
WISO-8601周数,周数从星期一开始。153
y年份,2位数字。'99'
Y年,4位数。'1999年'
z一年中的日子0365
Z时区偏移量,单位为秒。 UTC以西时区的偏移量总是为负数,对于UTC以东时,它们总是为正。-4320043200

【5】取消转义(mark_safe和safe)

  • Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。
  • 但是有的时候我们可能不希望这些HTML元素被转义
  • 比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。
  • 以后在写全栈项目时,前端代码不一定必须在前端页面书写
  • 也可以选择先在后端写好,再传递给前端页面展示

(1)前端转义(safe)

msg = '<h1>鸡你太美</h1>'
<p>转义字符(不转义) {{ msg }}</p>

<p>转义字符(转义) {{ msg|safe }}</p>
转义字符(不转义) <h1>鸡你太美</h1>

转义字符(转义)

鸡你太美(已变成h1标题格式)

(2)后端转义(mark_safe)

from django.utils.safestring import mark_safe
res = mark_safe('<h1>坤坤</h1>')
<p>转义字符(转义) {{ res }}</p>
转义字符(转义)

坤坤(已变成h1标题格式)
  • 前端

    • msg = '<h1>你太美</h1>'
      
    • {{ 值| safe}}

  • 后端

    • from django.utils.safestring import mark_safe
      
    • res = mark_safe("<h1>你太美</h1>")
      

转义字符(转义) {{ msg|safe }}

转义字符(不转义)

鸡你太美

转义字符(转义)

鸡你太美(已变成h1标题格式)


### (2)后端转义(mark_safe)

```java
from django.utils.safestring import mark_safe
res = mark_safe('<h1>坤坤</h1>')
<p>转义字符(转义) {{ res }}</p>
转义字符(转义)

坤坤(已变成h1标题格式)
  • 前端

    • msg = '<h1>你太美</h1>'
      
    • {{ 值| safe}}

  • 后端

    • from django.utils.safestring import mark_safe
      
    • res = mark_safe("<h1>你太美</h1>")
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1576593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年天津中德应用技术大学退役大学生专升本专业考试准考证下载

2024年天津中德应用技术大学退役大学生高职升本科专业课考试准考证下载及考生须知 一、准考证下载打印 4月7日14点开始&#xff0c;天津中德应用技术大学专业课报名审核通过的考生&#xff0c;登录天津中德应用技术大学专业课报名系统&#xff08;http://125.65.42.21:8091/j…

【实战解析】YOLOv9全流程训练至优化终极指南

【实战解析】YOLOv9全流程训练至优化终极指南 0.引言1.环境准备2.数据预处理&#xff08;1&#xff09;数据准备&#xff08;2&#xff09;按比例划分数据集&#xff08;3&#xff09;xml转txt脚本&#xff08;4&#xff09;配置文件 3.模型训练&#xff08;1&#xff09;单GPU…

4.7Qt

自由发挥应用场景实现一个登录窗口界面。 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置this->setWindowTitle("原神启动");this->setWindowIcon(QIcon("C:\\Users\\17212\\Pict…

【学习】移动端App性能测试流程有哪些

移动端App性能测试是保证App性能表现的重要环节之一。随着移动设备的普及和移动互联网的发展&#xff0c;移动端App的性能测试变得越来越重要&#xff0c;通过科学合理的性能测试可以发现并解决潜在的性能问题优化App运行效果提高用户体验。性能测试旨在评估App在各种场景下的性…

《从零开始学架构》读书笔记(一)

目录 软件架构设计产生的历史背景 软件架构设计的目的 系统复杂度来源 追求高性能 一、单机高性能 二、集群的高性能 追求高可用 一、计算高可用 二、存储高可用 追求可扩展性 一、预测变化 二、应对变化 追求安全、低成本、规模 一、安全 二、低成本 三、规模…

第7章 数据安全

思维导图 7.1 引言 数据安全包括安全策略和过程的规划、建立与执行&#xff0c;为数据和信息资产提供正确的身份验证、授权、访问和审计。虽然数据安全的详细情况(如哪些数据需要保护)因行业和国家有所不同&#xff0c;但是数据安全实践的目标是相同的&#xff0c;即根据隐私和…

数据结构初阶:栈和队列

栈 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO &#xff08; Last In First Out &#xff09;的原则。…

【服务器uwsgi + flask + nginx的搭建】

目录 服务器uwsgi flask nginx的搭建1. 安装必要的软件2. 启动nginx服务3. 测试Nginx4. 配置uwsgi和flask5. 配置nginx 服务器uwsgi flask nginx的搭建 1. 安装必要的软件 安装Python、uWSGI、Flask 和 Nginx。 # Ubuntu 安装命令 sudo apt-get update sudo apt-get ins…

推动科技创新润德生物邀您到场参观2024第13届生物发酵展

参展企业介绍 山东润德生物科技有限公司成立于2014年10月17日&#xff0c;是一家围绕生物制品的研发、生产、营销、国际贸易、技术服务为核心业务的国家高新技术企业&#xff0c;近年来荣获国家制造业单项冠军示范企业、国家级绿色工厂、国家知识产权优势企业、国家工业产品绿…

新人硬件工程师往哪个方向更有前途?

如果是比较沉默寡言&#xff0c;不擅长交际的&#xff0c;那么可以走技术路线。我这里有一套自动化入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习自动化&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我…

30天拿下Rust之实战Web Server

概述 随着互联网技术的飞速发展&#xff0c;Web服务器作为承载网站与应用的核心组件&#xff0c;其性能、稳定性和安全性都显得至关重要。Rust语言凭借其独特的内存安全保证、高效的性能以及丰富的生态系统&#xff0c;成为了构建现代Web服务器的理想选择。 新建项目 首先&…

工业视觉检测

目录 我对工业视觉检测的了解 一、关键组成部分 二、应用场景 三、技术挑战 我对工业视觉检测的了解 工业视觉检测是利用机器视觉技术对产品质量进行自动化检查的过程&#xff0c;它在制造业中扮演着至关重要的角色&#xff0c;用于确保产品质量、提高生产效率、减少人工成…

数仓开发之Flume《一》:Flume的概述及安装

目录 1. &#x1f959;Flume概述 1.1 Flume简介 1.2 Flume的架构 1. &#x1f9c0;agent介绍 2. ​Agent 主要有 3 个部分组成&#xff0c;Source、Channel、Sink。 &#x1f957;2.1 Source &#x1f957;2.2 Sink &#x1f957;2.3 Channel 3. &#x1f9c0;Flume 自…

2.k8s架构

目录 k8s集群架构 控制平面 kube-apiserver kube-scheduler etcd kube-controller-manager node 组件 kubelet kube-proxy 容器运行时&#xff08;Container Runtime&#xff09; cloud-controller-manager 相关概念 k8s集群架构 一个Kubernetes集群至少包含一个控制…

蓝桥杯刷题day14——盖印章【算法赛】

一、问题描述 小 Z 喜欢盖印章。 有一天,小 Z 得到了一个 nm 的网格图,与此同时,他的手上有两种印章(分别称为 A,B),如下图所示。 他想将这两种印章盖在这个网格图上。 由于小 Z 是一个有原则的人,他将按照以下规则进行操作。 每个印章所形成的图案的边必须和网格图…

三防平板定制服务:亿道信息与个性化生产的紧密结合

在当今数字化时代&#xff0c;个性化定制已经成为了市场的一大趋势&#xff0c;而三防平板定制服务作为其中的一部分&#xff0c;展现了数字化技术与个性化需求之间的紧密结合。这种服务是通过亿道信息所提供的技术支持&#xff0c;为用户提供了满足特定需求的定制化三防平板&a…

面向电力行业定制安全云工作站解决方案,麒麟信安出席2024年电力企业信创替代技术研讨会

日前&#xff0c;由中国电子企业协会主办的“2024年电力企业信创替代技术研讨会”在江苏南京正式召开。会议以国家推进实现自主可控、加快建设“数字中国”为大背景&#xff0c;聚焦电力企业紧抓“信创替代”机遇&#xff0c;通过安全可靠的软硬件迭代升级&#xff0c;实现企业…

2024/4/2—力扣—连续数列

代码实现&#xff1a; 思路&#xff1a;最大子数组和 解法一&#xff1a;动态规划 #define max(a, b) ((a) > (b) ? (a) : (b))int maxSubArray(int* nums, int numsSize) {if (numsSize 0) { // 特殊情况return 0;}int dp[numsSize];dp[0] nums[0];int result dp[0];fo…

day03 51单片机

51单片机学习 1 模块化编程 1.1 什么是模块化编程 随着我们的代码越来越复杂,我们的main.c越来越长,阅读性也越来越差。如果将来开始做项目,我们可能要同时操作好几个模块,这种情况下我们无法再把代码写到同一个文件,而是要分模块管理代码。 具体实现方法,就是将源码…

【go】模板展示不同k8s命名空间的deployment

gin模板展示k8s命名空间的资源 这里学习如何在前端单页面&#xff0c;调用后端接口展示k8s的资源 技术栈 后端 -> go -> gin -> gin模板前端 -> gin模板 -> html jsk8s -> k8s-go-client &#xff0c;基本资源(deployment等) 环境 go 1.19k8s 1.23go m…