Django开发之进阶篇
Django进阶篇
- 一、Django学习之模板
 - 二、Django学习之中间件
 - 默认中间件
 - 自定义中间件
 
- 三、Django学习之ORM
 - 定义模型类
 - 生成数据库表
 - 操作数据库
 - 添加
 - 查询
 - 修改
 - 删除
 
一、Django学习之模板
在 Django 中,模板(Template)是用于生成动态 HTML(或其他格式的文档)的文件,它允许你将数据与 HTML 结构分离,从而实现更好的代码组织和可维护性。
要在django框架中使用模板引擎把视图中的数据更好的展示给客户端,需要完成3个步骤:
- 在项目配置文件中指定保存模板文件的模板目录。一般模板目录都是设置在项目根目录或者主应用目录下。
 - 在视图中基于django提供的渲染函数绑定模板文件和需要展示的数据变量
 - 在模板目录下创建对应的模板文件,并根据模板引擎内置的模板语法,填写输出视图传递过来的数据。
 
配置模板目录:在当前项目根目录下创建了模板目录templates. 然后在settings.py, 模板相关配置,找到TEMPLATES配置项,填写DIRS设置模板目录。
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR,'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',],},},
]
 
-  
模板文件:模板文件是包含 HTML 结构和嵌入模板标签的文件。这些模板标签被 Django 解释器识别,并用于插入动态内容和逻辑。通常,模板文件以 .html 扩展名保存,但也可以使用其他扩展名。
 -  
模板语言:Django 使用自己的模板语言,其中包含了一系列模板标签和过滤器,用于处理数据、控制流程和生成动态内容。模板语言允许你在模板中插入变量、执行条件判断和循环等操作。
 -  
加载模板:在视图函数中,你可以使用 render() 函数来加载和渲染模板。这个函数接受一个请求对象、模板文件的路径和一个上下文字典作为参数,然后将模板渲染为 HTML,并返回一个包含渲染结果的 HttpResponse 对象。
from django.shortcuts import renderdef my_view(request):data = {'name': 'John'}return render(request, 'my_template.html', context=data) -  
模板标签:模板标签是以 {% … %} 包围的代码块,用于在模板中执行逻辑控制和循环操作。常见的模板标签包括:
{% for … %} … {% endfor %}:用于循环遍历列表或查询结果。
{% if … %} … {% elif … %} … {% else %} … {% endif %}:用于条件判断。
{% block … %} … {% endblock %}:用于定义和重写块内容。
{% include … %}:用于在模板中包含其他模板。 -  
模板变量:模板变量是以 {{ … }} 包围的代码块,用于插入动态数据到模板中。你可以在模板中使用上下文中的变量,如 {{ name }},以显示用户的名称。
 -  
模板过滤器:模板过滤器是可用于修改变量的方法。你可以在变量后面使用管道符 | 来应用过滤器。例如,{{ value|filter_name }}。Django 提供了许多内置过滤器,如 date、truncatechars、lower 等。

 -  
模板继承:Django 允许你创建模板的基础布局,并在子模板中继承和扩展它。这可以通过 {% extends … %} 和 {% block … %} 标签来实现。模板继承使你可以重用通用布局,并在不同页面中插入不同的内容。
 -  
模板标记:除了模板标签和变量外,你还可以在模板中使用模板标记(Template Tags),这是自定义的模板标签和过滤器。你可以编写自定义模板标记来执行复杂的逻辑操作或呈现特定的内容。
创建文件夹 templatetags (view.py 同级目录,必须是这个名称)
templatetags目录下创建分别创建__init__.py 和 custom_filter.py(可以自定义)
在custom_filter.py 写入如下模板from django import templateregister = template.Library()# 我这里以自定义电话过滤器举例 @register.filter def phone_num_filter(value):# 18720359678 > 187 **** 9678return f"{value[:3]} **** {value[7:]}"编写模板文件
开头导入 {% load custom_filter %}{% load custom_filter %} <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>电话薄</title> </head> <body> <table border="0" align="center" width="300px;"><tr><th>姓名</th><th>性别</th><th>联系方式</th></tr>{% for p in person_list%}<tr><td>{{ p.name }}</td><td>{{ p.phone_num | phone_num_filter }}</td><td>{{ p.sex }}</td></tr>{% endfor%}</table> </body> </html> 
二、Django学习之中间件
Django 中的中间件是一种机制,用于在请求和响应之间执行额外的处理操作。中间件可以在 Django 处理请求的不同阶段介入,允许你对请求和响应进行修改、记录、验证等操作。

默认中间件
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]
 
- django.middleware.security.SecurityMiddleware:
这个中间件负责提供一些与安全相关的功能,例如设置HTTP头部中的安全策略、强制使用HTTPS等。 - django.contrib.sessions.middleware.SessionMiddleware:
这个中间件处理会话数据。它为每个请求提供了一个会话对象,可以用于在请求之间存储和检索数据。 - django.middleware.common.CommonMiddleware:
这个中间件提供了一些常见的Web开发功能,如URL重写、缓存控制等。 - django.middleware.csrf.CsrfViewMiddleware:
这个中间件用于处理跨站请求伪造(CSRF)保护。它在提交表单数据时验证CSRF令牌,以防止恶意站点利用用户的身份执行恶意操作。 - django.contrib.auth.middleware.AuthenticationMiddleware:
这个中间件处理用户身份验证。它在请求过程中检查用户是否已通过身份验证,并将用户对象添加到请求的上下文中。 - django.contrib.messages.middleware.MessageMiddleware:
这个中间件处理闪存消息。闪存消息是一种在请求之间传递的临时消息,通常用于显示一次性的成功消息、错误消息或其他通知。 - django.middleware.clickjacking.XFrameOptionsMiddleware:
这个中间件提供了点击劫持(clickjacking)保护。它通过设置X-Frame-Options响应头来防止将网站嵌入到其他网页的iframe中,从而防止点击劫持攻击。 
自定义中间件
中间件可以定义的四个方法,分别是
process_request(self, request)
process_view(self, request, view_func, view_args, view_kwargs)
process_exception(self, request, exception)
process_response(self, request, response)
 
- 创建中间件文件:在Django根目录创建一个新的文件夹(middlewares),然后在文件夹中创建一个新的Python文件
 - 导入MiddlewareMixin类,在中间件,导入django.utils.deprecation.MiddlewareMinxin类
 - 定义中间件类:创建一个新的类,继承自MiddlewareMixin类,并实现对应方法。
● def process_request(self, request): 在每个请求处理之前调用,可以在这里执行一些预处理操作。
● def process_response(self, request, response):在每个请求处理完成后调用,可以在这里执行一些后处理操作,并返回响应对象。 - 配置中间件顺序,打开项目的setting.py文件,找到MIDDLEWARE列表,将自定义中间件的完整路径添加到列表中,并根据需要调整中间件的顺序。
 - 配置完成,保存文件重启Django开发服务器。
 
三、Django学习之ORM
Django 的 ORM(Object-Relational Mapping)是一个强大的工具,用于将 Python 对象映射到数据库表,允许你使用 Python 代码来执行数据库操作,而不必直接编写 SQL 查询语句。
定义模型类
在 Django 中,数据库表的结构和字段都是通过 Python 类来定义的,这些 Python 类通常称为模型类(Model)。
 通过继承 django.db.models.Model 类来创建模型类,并在类中定义表的字段,字段的类型以及其他选项。
 
 
 需求:通过模型类,生成一个用户表。
 字段有:账号、密码、状态、电话、邮箱、创建时间、性别。
from django.db import models# Create your models here.class User(models.Model):STATUS_CHOICES = ((0, '正常'),(1, '封号'))GENDER_CHOICES = ((0, '女'),(1, '男'))username = models.CharField(max_length=30, null=True)password = models.CharField(max_length=30, null=True)status = models.CharField(max_length=1, choices=STATUS_CHOICES, default=0)gender = models.CharField(max_length=1, choices=GENDER_CHOICES, default=0)phone = models.CharField(max_length=11)email = models.EmailField()created_time = models.DateTimeField(auto_now=True)class Meta:db_table = "django_user" 
生成数据库表
一旦定义了模型类,你可以使用 Django 的 makemigrations 和 migrate 命令来创建和更新数据库表。
python manage.py makemigrations
python manage.py migrate
 

操作数据库
一旦模型类和数据库表创建好,你可以使用模型类来进行数据库操作,如插入、查询、更新和删除记录。
 创建book的模型类,数据迁移生成数据表。
from django.db import modelsclass Book(models.Model):id = models.AutoField(primary_key=True, verbose_name="book_id")title = models.CharField(max_length=32, verbose_name="书名")author = models.CharField(max_length=10, verbose_name="作者", null=True)state = models.BooleanField(verbose_name="状态")published_date = models.DateField(verbose_name="出版时间")price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="价格")publishers = models.CharField(max_length=32, verbose_name="出版商")class Meta:db_table = "django_book"
 
python manage.py makemigrations
 python manage.py migrate
这里利用Django中单元测试来说明,生成的数据都是测试数据,不会写入数据库。
 在manage.py 文件终端下 运行 python manage.py test app.tests
 
添加
# -*- coding: utf-8 -*-
from django.test import TestCase
from .models import Bookclass BookTestcase(TestCase):def setUp(self) -> None:# 添加书籍# 方式一book_obj1 = Book.objects.create(title="雪山大地",author="杨志军",state=1,published_date="2023-02-01",price=78,publishers="作家出版社")# 方式二book_obj2 = Book(title="寻觅意义",author="王德峰",state=1,published_date="2022-10-01",price=49.80,publishers="山东文艺出版社")book_obj2.save()def test_book_query(self):book_result1 = Book.objects.filter(title="雪山大地")self.assertEqual("杨志军", book_result1.first().author)book_result2 = Book.objects.filter(title="寻觅意义")self.assertEqual('王德峰', book_result2.first().author) 
查询
# -*- coding: utf-8 -*-
from django.test import TestCase
from .models import Bookclass BookTestcase(TestCase):def setUp(self) -> None:# 添加书籍book_data_info = [{"title": "寻觅意义","author": "王德峰","state": 1,"published_date": "2022-10-01","price": 49.80,"publishers": "山东文艺出版社"},{"title": "国画","author": "王跃文","state": 1,"published_date": "2023-06-01","price": 69.80,"publishers": "湖南文艺出版社"},{"title": "鳄鱼","author": "莫言","state": 1,"published_date": "2023-06-01","price": 99.80,"publishers": "浙江文艺出版社"},{"title": "长安的荔枝","author": "马伯庸","state": 1,"published_date": "2022-10-01","price": 66.66,"publishers": "湖南文艺出版社"},]# 通过解包的方式传入for book_data in book_data_info:Book.objects.create(**book_data)def test_book_query(self):# 基本查询book_result1 = Book.objects.filter(title="长安的荔枝")self.assertEqual("马伯庸", book_result1.first().author)book_result2 = Book.objects.filter(title="寻觅意义")self.assertEqual('王德峰', book_result2.first().author)def test_book_fuzzy_query(self):# 下划线模糊查询# 查询价格大于50的书的名称fuzzy_query_obj1 = Book.objects.filter(price__gt=50)book_list = []for f in fuzzy_query_obj1.values():book_list.append(f.get("title"))# 验证超过50的数为3本self.assertEqual(3, len(book_list))# 查询湖南开头的出版社的数量,验证为2fuzzy_query_obj2 = Book.objects.filter(publishers__startswith="湖南")self.assertEqual(2, fuzzy_query_obj2.count()) 
修改
# -*- coding: utf-8 -*-
from django.test import TestCase
from .models import Bookclass BookTestcase(TestCase):def setUp(self) -> None:# 添加书籍book_data_info = [{"title": "寻觅意义","author": "王德峰","state": 1,"published_date": "2022-10-01","price": 49.80,"publishers": "山东文艺出版社"},{"title": "国画","author": "王跃文","state": 1,"published_date": "2023-06-01","price": 69.80,"publishers": "湖南文艺出版社"},{"title": "鳄鱼","author": "莫言","state": 1,"published_date": "2023-06-01","price": 99.80,"publishers": "浙江文艺出版社"},{"title": "长安的荔枝","author": "马伯庸","state": 1,"published_date": "2022-10-01","price": 66.66,"publishers": "湖南文艺出版社"},]# 通过解包的方式传入for book_data in book_data_info:Book.objects.create(**book_data)def test_book_update(self):# 更新# 将鳄鱼这边书的出版时间改为2023-08-01update_time = "2023-08-01"Book.objects.filter(title="鳄鱼").update(published_date=update_time)# 查询是否更新成功book_publisher_date = Book.objects.filter(title="鳄鱼").first().published_dateself.assertEqual(update_time, str(book_publisher_date)) 
删除
# -*- coding: utf-8 -*-
from django.test import TestCase
from .models import Bookclass BookTestcase(TestCase):def setUp(self) -> None:# 添加书籍book_data_info = [{"title": "寻觅意义","author": "王德峰","state": 1,"published_date": "2022-10-01","price": 49.80,"publishers": "山东文艺出版社"},{"title": "国画","author": "王跃文","state": 1,"published_date": "2023-06-01","price": 69.80,"publishers": "湖南文艺出版社"},{"title": "鳄鱼","author": "莫言","state": 1,"published_date": "2023-06-01","price": 99.80,"publishers": "浙江文艺出版社"},{"title": "长安的荔枝","author": "马伯庸","state": 1,"published_date": "2022-10-01","price": 66.66,"publishers": "湖南文艺出版社"},]# 通过解包的方式传入for book_data in book_data_info:Book.objects.create(**book_data)def test_book_delete(self):# 删除Book.objects.filter(title="长安的荔枝").delete()# 查询count = Book.objects.filter(title="长安的荔枝").count()self.assertEqual(0, count)相关文章:
Django开发之进阶篇
Django进阶篇 一、Django学习之模板二、Django学习之中间件默认中间件自定义中间件 三、Django学习之ORM定义模型类生成数据库表操作数据库添加查询修改删除 一、Django学习之模板 在 Django 中,模板(Template)是用于生成动态 HTMLÿ…...
【C++】:类和对象(3)
朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…...
windows创建服务:更新服务信息乱码问题(ChangeServiceConfig)
因为小项目需要创建windows服务,安装微软官方示例一切都挺顺利,代码运行后发现配置的信息在系统里显示乱码。打开注册表发现的确是乱码。这就排除软件读取得问题,而是调用ChangeServiceConfig系统函数写入时就发生了乱码。让我在网上查找了一…...
Spark 9:Spark 新特性
Spark 3.0 新特性 Adaptive Query Execution 自适应查询(SparkSQL) 由于缺乏或者不准确的数据统计信息(元数据)和对成本的错误估算(执行计划调度)导致生成的初始执行计划不理想,在Spark3.x版本提供Adaptive Query Execution自适应查询技术,通过在”运行…...
Angular+html+js前端加载生命周期
参考:document.readyState - Web API 接口参考 | MDN (mozilla.org) 第一步,JS生命周期第一步 文档加载中状态,document.readyState loading 第二步,JS生命周期第二步 可交互状态,document.readyState interacti…...
社区投稿| 以安全视角,深度剖析 Sui Staking 与 LSD
本篇技术研报由 MoveBit 研究团队的 Jason 撰写 #1 Sui Staking 介绍 1.1 Sui 网络概述 Sui 网络由一组独立的验证者运行,每个验证者在自己的机器或集群上运行独立的 Sui 软件实例。 Sui 采用委托权益证明(DPoS)来确定哪些验证者参与网络…...
AM@邻域@极限定义中的符号说明
文章目录 abstract邻域👺邻域中心和半径去心邻域 ϵ , δ \epsilon,\delta ϵ,δ的意义各种极限定义的共同点几何意义极限定义中的极限过程临界值 ϵ \epsilon ϵ的选取👺 概念辨析👺无限接近不同于越来越接近例例 越来越接近推不出无限接近 …...
论Oracle兼容性,我们需要做什么
作者介绍:王海峰,数据库系统架构师,YashanDB SQL开发负责人,10年以上数据库内核技术开发经验。 Oracle兼容性是目前国产数据库的关键任务之一,其直接影响到商业迁移的成本和竞争力。 我们经常发现,部分国产…...
你知道多号发圈的同时并延迟评论的方式吗?
你知道多号发圈的同时并延迟评论的方式吗? 其实很简单。 步骤1:编辑好朋友圈内容 步骤2:设置延迟评论 步骤3:选择多个号发圈 通过以上3个步骤,就可以实现多号发圈的同时并延迟评论。 在发布朋友圈前,只需要…...
【BugBounty】记一次XSS绕过
前言 最近一直在看国外的赏金平台,绕waf是真的难受, 记录一下绕过的场景。 初步测试 一开始尝试XSS,发现用户的输入在title中展示,那么一般来说就是看能否闭合,我们从下面图中可以看到,输入尖括号后被转成了实体。 …...
Linux文件目录结构详解:根目录和常见子目录介绍
文章目录 引言1. 什么是Linux文件目录结构2. Linux文件系统的重要性 根目录(/)2.1 根目录的作用和特点2.2 根目录下常见目录的介绍 /bin 目录3.1 /bin 目录的作用和内容3.2 常见的可执行命令示例 /etc 目录4.1 /etc 目录的作用和内容4.2 配置文件的存放位…...
知识付费小程序的推广与用户增长策略
在知识付费小程序开发完成后,推广和用户增长是关键的成功因素。本文将探讨一些推广策略和用户增长方法,并提供代码示例,帮助您在知识付费小程序中实施这些策略。 1. 社交媒体分享功能 在知识付费小程序中添加社交媒体分享功能,…...
微信小程序 获取当前屏幕的可见高宽度
很多时候我们做一下逻辑 需要用整个窗口的高度或宽度参与计算 而且很多时候我们js中拿到的单位都是px像素点 没办法和rpx同流合污 官方提供了wx.getSystemInfoSync() 可以获取到部分窗口信息 其中就包括了整个窗口的宽度和高度 wx.getSystemInfoSync().windowHeight 返回值为像…...
使用 Splashtop 驾驭未来媒体和娱乐
在当今时代,数字转型不再是可选项,而是必选项。如今,媒体与娱乐业处于关键时刻,正在错综复杂的创意、技术和远程协作迷宫之中摸索前进。过去几年发生的全球事件影响了我们的日常生活,不可逆转地改变了行业的运作方式&a…...
Tomcat项目启动报错
java.io.IOException: java.lang.ClassCastException: Cannot cast org.springframework.web.SpringServletContainerInitializer to javax.servlet.ServletContainerInitializer解决办法:可能Tomcat版本不对,使用7.0.90版本启动报错,使用8.0…...
offer
【录用通知书】 如何判断公司的好坏呢。 注意了,我们软件行业,技术管理类,技术类,产品类 好公司好企业基本都会给你说清楚,一项多少钱,加班多少钱,这样的 像这类公司的薪资结构复杂就要特别…...
漏洞复现--鸿运主动安全监控云平台任意文件下载
免责声明: **文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何…...
第二章 物理层 | 计算机网络(谢希仁 第八版)
文章目录 第二章 物理层2.1 物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.2 有关信道的几个基本概念2.2.3 信道的极限容量 2.3 物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 2.4 信道复用技术2.4.1 频分复用、时分复用和统计时分复…...
路由高级特性
项目拓扑与项目需求 项目需求 某企业网络使用ospf和isis作为IGP协议实现内部网络的互联互通,区域规划和IP规划如图所示,现在要求实现如下需求: LSW1和AR1使用vlan10互联,与AR2使用vlan20互联,LSW1与LSW2、3、4之间使…...
【MySQL】数据库排查慢查询、死锁进程排查、预防以及解决方法
MySQL数据库排查慢查询、死锁进程及解决方法 一、排查慢查询 1.1检查慢查询日志是否开启 1.1.1使用命令检查是否开启慢查询日志: SHOW VARIABLES LIKE slow_query_log;如果是 Value 为 off 则并未开启 1.1.2开启并且查看慢查询日志: MySQL提供了慢查询日志功能,可以记录所…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
