Django开发之进阶篇

Django进阶篇

  • 一、Django学习之模板
  • 二、Django学习之中间件
    • 默认中间件
    • 自定义中间件
  • 三、Django学习之ORM
    • 定义模型类
    • 生成数据库表
    • 操作数据库
      • 添加
      • 查询
      • 修改
      • 删除


一、Django学习之模板

在 Django 中,模板(Template)是用于生成动态 HTML(或其他格式的文档)的文件,它允许你将数据与 HTML 结构分离,从而实现更好的代码组织和可维护性。

要在django框架中使用模板引擎把视图中的数据更好的展示给客户端,需要完成3个步骤:

  1. 在项目配置文件中指定保存模板文件的模板目录。一般模板目录都是设置在项目根目录或者主应用目录下。
  2. 在视图中基于django提供的渲染函数绑定模板文件和需要展示的数据变量
  3. 在模板目录下创建对应的模板文件,并根据模板引擎内置的模板语法,填写输出视图传递过来的数据。

配置模板目录:在当前项目根目录下创建了模板目录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',
]
  1. django.middleware.security.SecurityMiddleware:
    这个中间件负责提供一些与安全相关的功能,例如设置HTTP头部中的安全策略、强制使用HTTPS等。
  2. django.contrib.sessions.middleware.SessionMiddleware:
    这个中间件处理会话数据。它为每个请求提供了一个会话对象,可以用于在请求之间存储和检索数据。
  3. django.middleware.common.CommonMiddleware:
    这个中间件提供了一些常见的Web开发功能,如URL重写、缓存控制等。
  4. django.middleware.csrf.CsrfViewMiddleware:
    这个中间件用于处理跨站请求伪造(CSRF)保护。它在提交表单数据时验证CSRF令牌,以防止恶意站点利用用户的身份执行恶意操作。
  5. django.contrib.auth.middleware.AuthenticationMiddleware:
    这个中间件处理用户身份验证。它在请求过程中检查用户是否已通过身份验证,并将用户对象添加到请求的上下文中。
  6. django.contrib.messages.middleware.MessageMiddleware:
    这个中间件处理闪存消息。闪存消息是一种在请求之间传递的临时消息,通常用于显示一次性的成功消息、错误消息或其他通知。
  7. 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)
  1. 创建中间件文件:在Django根目录创建一个新的文件夹(middlewares),然后在文件夹中创建一个新的Python文件
  2. 导入MiddlewareMixin类,在中间件,导入django.utils.deprecation.MiddlewareMinxin类
  3. 定义中间件类:创建一个新的类,继承自MiddlewareMixin类,并实现对应方法。
    ● def process_request(self, request): 在每个请求处理之前调用,可以在这里执行一些预处理操作。
    ● def process_response(self, request, response):在每个请求处理完成后调用,可以在这里执行一些后处理操作,并返回响应对象。
  4. 配置中间件顺序,打开项目的setting.py文件,找到MIDDLEWARE列表,将自定义中间件的完整路径添加到列表中,并根据需要调整中间件的顺序。
  5. 配置完成,保存文件重启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)

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

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

相关文章

自动拟人对话机器人在客户服务方面起了什么作用?

在当今数字时代&#xff0c;企业不断寻求创新的方法来提升客户服务体验。随着科技的不断进步和消费者期望的提升&#xff0c;传统的客户服务方式逐渐无法满足现代消费者的需求。因此&#xff0c;许多企业正在积极探索利用新兴技术来改进客户服务&#xff0c;自动拟人对话机器人…

阿里云轻量应用服务器流量价格表(计费/免费说明)

阿里云轻量应用服务器套餐有的限制月流量&#xff0c;有的不限制月流量&#xff0c;限制每月流量的套餐&#xff0c;如果自带的免费月流量包用完了&#xff0c;流量超额部分需要另外支付流量费&#xff0c;阿里云百科aliyunbaike.com分享阿里云轻量应用服务器月流量超额收费价格…

phpstorm不提示$this->request,不提示Controller父类的方法

![在这里插入图片描述](https://img-blog.csdnimg.cn/d55799a22b724099930eb7fb67260a12.png 最后 保存就可以了

浅谈风力发电场集中监控系统解决方案

作为清洁能源之一&#xff0c;风力发电场近几年装机容量快速增长。8月17日&#xff0c;国家能源局发布1-7月份全国电力工业统计数据。截至7月底&#xff0c;全国累计发电装机容量约27.4亿千瓦&#xff0c;同比增长11.5%。其中&#xff0c;太阳能发电装机容量约4.9亿千瓦&#x…

【JavaEE】_tomcat的安装与简单使用

目录 1. 安装tomcat 1.1 下载tomcat并解压缩 1.2 启动tomcat 1.3 访问tomcat欢迎页面 2. tomcat简单使用&#xff1a;部署前端代码 3. 基于tomcat的网站后端开发 tomcat是一个HTTP服务器&#xff0c;HTTP协议就是HTTP客户端与HTTP服务器之间通信使用的协议。 其中HTTP客…

管理Linux的联网

1. RHEL9版本特点 在RHEL7版本中&#xff0c;同时支持network.service和NetworkManager.service&#xff08;简称NM&#xff09;。 在RHEL8上默认只能通过NM进行网络配置&#xff0c;包括动态ip和静态ip,若不开启NM&#xff0c;否则无法使用网络 RHEL8依然支持network.service&…

【Spring Boot】SpringBoot 单元测试

SpringBoot 单元测试 一. 什么是单元测试二. 单元测试的好处三. Spring Boot 单元测试单元测试的实现步骤 一. 什么是单元测试 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试。 二. 单元测试的好处…

Kubernetes革命:云原生时代的应用编排和自动化

文章目录 什么是Kubernetes以及为何它备受欢迎&#xff1f;云原生应用和K8s的关系Kubernetes的核心概念&#xff1a;Pods、Services、ReplicaSets等部署、扩展和管理应用程序的自动化容器编排的演进&#xff1a;Docker到Kubernetes实际用例&#xff1a;企业如何受益于K8s的应用…

Ubuntu 18.04 OpenCV3.4.5 + OpenCV3.4.5 Contrib 编译

目录 1 依赖安装 2 下载opencv3.4.5及opencv3.4.5 contrib版本 3 编译opencv3.4.5 opencv3.4.5_contrib及遇到的问题 1 依赖安装 首先安装编译工具CMake&#xff0c;命令安装即可&#xff1a; sudo apt install cmake 安装Eigen&#xff1a; sudo apt-get install libeigen3-…

计算机的体系与结构

文章目录 前言一、冯诺依曼体系二、现代计算机的结构总结 前言 今天给大家介绍计算机的体系和结构&#xff0c;分为两个板块&#xff1a;冯诺依曼体系和现代计算机的结构。 一、冯诺依曼体系 冯诺依曼体系是将程序指令和数据一起存储的计算机设计概念结构。 冯诺依曼体系可以…

SPA项目之主页面--数据表格的增删改查

SPA项目之主页面--数据表格的增删改查 一.增删改查1.样式准备2.增加3.删除4.修改5.查询二.表单验证1.在表单中使用验证规则 一.增删改查 1.样式准备 <template><div class"books" style"padding: 20px;"><el-form :inline"true"…

c++视觉处理---高斯滤波

高斯滤波处理 高斯滤波是一种常用的平滑滤波方法&#xff0c;它使用高斯函数的权重来平滑图像。高斯滤波通常用于去除噪声并保留图像中的细节。在OpenCV中&#xff0c;可以使用cv::GaussianBlur()函数来应用高斯滤波。 以下是cv::GaussianBlur()函数的基本用法&#xff1a; …

【技能树笔记】网络篇——练习题解析(五)

目录 前言 一、应用层的作用 1.1 应用层的作用 二、HTTP协议 2.1 HTTP协议 三、FTP协议 3.1 FTP协议 四、DNS协议 4.1 DNS协议 五、DHCP协议 5.1 DHCP协议 六、邮件协议 6.1 电子邮件协议 总结 前言 本篇文章给出了CSDN网络技能树中的部分练习题解析&#xff0c…

如何把“中式发音”调整到机器偏爱的口音?Elena老师带你详解突破点!

目录 1.元音辅音不清晰 2.无重音式发音→缺少word stress(听起来有气无力&#xff0c;声音很慵懒/lazy) 3.拖音式发音拖音节来强调重音 4.机器人式无情感朗读→缺乏句子重音(念经式读法&#xff0c;没有节奏感) 带收音有话筒耳机 拿手机无话筒录 事实证明很多时候&#xf…

ChatGLM2-6B微调实践-Lora方案

ChatGLM2-6B微调实践-Lora方案 环境部署Lora微调项目部署准备数据集修改训练脚本adapter推理模型合并与量化合并后的模型推理 微调过程中遇到的问题参考&#xff1a; 环境部署 申请阿里云GPU服务器&#xff1a; CentOS 7.6 64Anaconda3-2023.07-1-Linux-x86_64Python 3.11.5G…

中小学生用护眼台灯好不好?好用不伤眼的台灯推荐

在现代社会&#xff0c;人们越来越注重眼睛的健康问题&#xff0c;尤其是对于在电子产品前工作或学习的人来说&#xff0c;护眼灯的需求变得越来越重要。护眼台灯专为保护眼睛而设计&#xff0c;具有多种功能和特点。当然市面上的台灯大同小异&#xff0c;但是在选择台灯时还是…

排序算法——选择排序

一、介绍&#xff1a; 选择排序就是按照一定的顺序从选取第一个元素索引开始&#xff0c;将其储存在一个变量值中&#xff0c;根据排序规则比较后边每一个元素与这个元素的大小&#xff0c;根据排序规则需要&#xff0c;变量值的索引值进行替换&#xff0c;一轮遍历之后&#x…

STM32 Cube项目实战开发过程中--调用Freemodbus通信出现异常问题原因分析--ADC DMA初始化顺序导致串口数据异常问题解决办法

文章目录 1.ADC与DMA初始化顺序导致使用Freemodbus串口通信异常&#xff1a;2.通信异常时串口初始化的顺序为&#xff1a;3.重新调整初始化位置后&#xff0c;通信问题解决&#xff1a;5.重新调整初始化位置后&#xff0c;通信正常&#xff1a;总结&#xff1a;Cube开发库系统默…

Linux虚拟机克隆之后使用ip addr无法获取ip地址

Linux虚拟机克隆之后使用ip addr无法获取ip地址 因为克隆得到的虚拟机&#xff0c;与原先的linux系统是一模一样的包括MAC地址和IP地址。需要修改信息。 设置IP地址&#xff1a; 使用vi命令打开linux的网卡 //ifcfg-enth0是虚拟网卡的名称&#xff0c;如果你的不叫这个名字&a…

Redis(六) 内存策略

文章目录 Redis内存回收一、过期策略Redis是如何知道一个key是否过期的&#xff1f;是不是TTL到期就立即删除呢&#xff1f; 二、淘汰策略 Redis内存回收 一、过期策略 Redis是如何知道一个key是否过期的&#xff1f; 利用两个Dict分别记录key-value对及key-ttl对 是不是TTL到…