Django学习笔记:模板层

本文深入探讨Django模板系统的应用,包括变量渲染、过滤器、标签、自定义扩展及模板继承,提供实例代码,助您掌握高效开发技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式。
先看一个简单的示例:
项目名\app名\views.py

from django.shortcuts import render, HttpResponse, redirect
import datetime

def current_date(request):
    now = datetime.datetime.now()
    return render(request, 'current_datetime.html', {'current_date': str(now)[:19]})

项目名\templates\current_datetime.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8"></html>
	<title>Title</title>
</head>
<body>
<p>This is 模板语法</p>
现在时刻是:<h4>{{current_date}}</h4>
</body>
1 模板语法之变量

在 Django 模板中遍历复杂数据结构的关键是句点字符, 语法如下:
项目名\app名\views.py

def index(request):
    '''
    模板渲染语法由render渲染
    name = "CY"
    age = 35
    students = ["A","B","C"]   # 列表
    info = {"name": "CY", "age": "88"}   # 字典

    class Animal(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age

        def running(self):
            print("running")

    cy = Animal("cy", 99)
    ll = Animal("ll", 98)
    person_list = [cy, ll]
	return render(request, "index.html", locals())   # locals 返回包含当前范围的局部变量的字典。

项目名\templates\index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
	<meta charset="UTF-8">
	<title>Mysite</title>
	<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<p>This is 模板语法</p>
<h4>1.渲染各种数据类型</h4>
<p>姓名 {{name}} 年龄 {{age}}</p>
<p>{{ students.0 }}</p>  <!-- 查询 列表-->
<p>{{ students.1 }}</p>  <!-- 查询 列表-->
<p>{{ info }}</p>  <!-- 查询 字典-->
<p>{{ info.name }}</p>  
<p>{{ info.age }}</p>  
<p>{{ person_list.0.name }}</p>  

注意:句点符也可以用来引用对象的方法(无参数方法),例如:

{{ info.name.upper }}

index页面结果:

在这里插入图片描述

2 模板之过滤器

语法:
{{obj|filter__name:param}}
项目名\app名\views.py

def index(request):
	now = datetime.datetime.now()
    book_list = ["活着", "平凡的世界", "解忧杂货铺"]  # 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。
    file_size = 123123123
    article = "Function views: 1,Add an import:  from my_app import views, 2. Add a URL to urlpatterns"
    link = "<a href='http://www.baidu.com'>点我</a>"
    tag = "<script>alert(123)</script>"
    return render(request, "index.html", locals())   # locals 返回包含当前范围的局部变量的字典。

项目名\templates\index.html

<h4>2.过滤器</h4>
<P>{{ now }}</P>  <!-- 无过滤器显示时间格式 -->
<P>{{ now|date:"Y-m-d" }}</P>  <!-- date -->
<p>{{ book_list|length }}</p>  <!-- length 返回值的长度。它对字符串和列表都起作用 -->
<p>{{ book_list|default:"无符合条件的目录"}}</p>   <!-- default -->
<p>{{ file_size|filesizeformat }}</p>  <!-- filesizeformat 将值格式化为一个可读的文件尺寸 -->
<p>{{ article|truncatechars:7 }}</p>  <!-- truncatechars 如果字符串字符多于指定的字符数量,将会被截断。截断的字符数量也包括省略号,以(“...”)结尾。-->
<p>{{ article|truncatewords:5 }}</p>  <!-- 截断单词,5个单词。以省略号序列(“...”)结尾。-->
<p>{{ link|safe }}</p> <a href='http://www.baidu.com'>点我</a>  <!--如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义 -->
<p>{{ tag|safe }}</p>   <!-- 页面标签会提示安全弹窗-->

index页面结果:
在这里插入图片描述
关于safe :
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。

3 模板之标签

标签看起来像是这样的: {% tag %}。
标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。
一些标签需要 开始结束 标签
例如:{% tag %} …标签 内容 … {% endtag %}

<h4>3.标签</h4>
<!--for标签-->
<ul>
	{% for book in book_list %}  <!-- 遍历每一个元素 -->
		<li>  {{ book }} {{ forloop.counter }}</li>
	{% endfor %}
</ul>

<!--if 标签-->
{% if age > 100 %}  <!-- 对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。-->
<p>100</p>  <!-- if 成立,渲染此标签-->
{% else %}
<p>{{ age }}</p>  <!-- if 不成立,渲染此标签 实际为 age = 35-->
{% endif %}

<!-- with标签 -->
<p> {{ person_list.1.name }}</p>
<p>
	{% with name=person_list.1.name %}   <!-- 注意:name=xxx 中间不允许有空格 否则会报错!'with' expected at least...-->
	{{ name }}
	{% endwith %}
</p>

index页面结果:

3.标签

活着 1
平凡的世界 2
解忧杂货铺 3
35
ll
ll

知识拓展:csrf_token 标签
防止跨站攻击:
表单:在 Form 表单中添加一个隐藏的的字段,值是 csrf_token。
原理:在浏览器访问网站A时,网站A设置cookie会增加随机值csrf_token,这个值是随机的。返回给浏览器时,cookie会储存在浏览器,同时会把csrf_token传给表单里面的隐藏字段。所以当浏览器用自己的表单时会自带csrf_token,网站A取到这个值和cookie里的csrf_token一致就通过。而网站B里面的表单没有这个值,所以不能通过,这样就阻止了恶意攻击。非表单也是这样的原理。
目的是防御CSRF攻击。
Token就是令牌,最大的特点就是随机性,不可预测。
示例如下:
一、项目名\templates\login.html

<!--csrf_token 标签 :这个标签用于跨站请求伪造保护-->
...
<body>
<form action="/login/" method="post">
	{% csrf_token %}   <!-- 这个标签用于跨站请求伪造保护 -->
	<!--此标签必须放在 form 表单标签内,否则报错-->
	<!--网页 Response 信息中多了一行 :<input type='hidden' name='csrfmiddlewaretoken' value='6nfubmaDIrRUe20GhFyqZDEGEqQyZ9XZ' />-->
	用户名 <input type="text" name="user">
	密码 <input type="password" name="pwd">
	<input type="submit">
</form>
</body>

二、项目名\settings.py

MIDDLEWARE_CLASSES = (
    # 'django.middleware.csrf.CsrfViewMiddleware', 
	# 确保此行代码关闭,用于演示不加认证防御情况下,可轻易获取内容。
)

三、确认 requests 已安装,然后导入requests模块
项目名\app名\tests.py

# 以下代码用于演示
import requests

res = requests.post("http://127.0.0.1:8000/login/",
     data={
    "user":"cy",
    "pwd":"123"
})
print(res.text)

最后运行 tests.py 文件,输出结果便是index.html的页面内容。

"D:\Program Files\Mypython\Myvenv\Myvenv_Dj1.8\Scripts\Python.exe" ...

<!DOCTYPE html>
<html lang="zh-CN">
<head>
	<meta charset="UTF-8">
	<title>Mysite</title>
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="stylesheet" href="/static/commons.css" />
</head>
<body>
<p>This is 模板语法</p>
<h4>1.渲染各种数据类型</h4>
...
4 自定义标签和过滤器

1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
2、在app中创建templatetags模块(模块名只能是templatetags)
3、创建任意 .py 文件,如:my_tags.py
4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py
5、使用simple_tag和filter(如何调用)
注意:filter可以用在 if 等语句后,simple_tag 不可以

5 模板继承 (extend)

Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

资源下载链接为: https://pan.quark.cn/s/967a7e1a5d94 《东北大学应用数理统计2009—2020真题及个人答案解析》是一份极具价值的学习资料,对于准备东北大学应用数理统计课程考试的学生而言意义非凡。它涵盖了十二年的考试真题以及作者的详细答案解析,为学生提供了一个深入了解考试方向、复习要点和解题技巧的优质平台。 数理统计作为应用数学的重要分支,主要基于概率论理论,通过收集、分析、解释和呈现数据来解决实际问题。在东北大学的该课程中,学生需掌握诸多核心知识点,包括样本与总体、随机变量、期望值与方差、概率分布、假设检验、置信区间、线性回归等。 首先,样本与总体是统计学的基础概念。通过对样本的研究来推断总体特征,理解它们之间的关系及抽样分布的重要性至关重要。其次,随机变量是概率论的核心,无论是连续型还是离散型随机变量,掌握其概率密度函数或概率质量函数是进行统计推断的关键。期望值和方差分别反映随机变量的平均值和波动程度,帮助我们了解随机现象的中心趋势和稳定性。此外,常见的概率分布如均匀分布、正态分布、泊松分布、二项分布等,对于分析实际问题中的数据分布极为重要。假设检验是科研和决策中的重要环节,常用的T检验、Z检验、卡方检验和F检验等方法,能够帮助判断数据是否支持特定假设。置信区间则用于估计总体参数的不确定范围,其计算和解释是理解统计推断的关键。线性回归是预测和建模的常用方法,通过分析最佳拟合直线来揭示变量间的关系,而残差分析、多重共线性和模型选择等则是提升回归分析能力的重要方面。 在解答这些真题时,作者不仅检验了自己的知识掌握程度,还分享了个人的解题思路和策略。这些内容对于后来的学习者来说极具参考价值。通过深入研究这些真题和答案,学生可以熟悉考试的常见题型,把握出题老师的命题风格,并学会如何高效地组织和呈现答案。这份资料对于提升学生的数理统计理论水平和
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值