Django开发之进阶篇

news2024/11/23 23:58:50

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 render
    
    def 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 template
    
    register = template.Library()
    
    # 我这里以自定义电话过滤器举例
    @register.filter
    def phone_num_filter(value):
        # 18720359678 > 187 **** 9678
        return 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 models

class 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 Book


class 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 Book


class 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))

        # 查询湖南开头的出版社的数量,验证为2
        fuzzy_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 Book


class 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-01
        update_time = "2023-08-01"
        Book.objects.filter(title="鳄鱼").update(published_date=update_time)
        # 查询是否更新成功
        book_publisher_date = Book.objects.filter(title="鳄鱼").first().published_date
        self.assertEqual(update_time, str(book_publisher_date))

	

删除

# -*- coding: utf-8 -*-
from django.test import TestCase
from .models import Book


class 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.coloradmin.cn/o/1071641.html

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

相关文章

Jmeter常用断言之断言持续时间简介

Duration Assertion&#xff1a;断言持续时间。 断言持续时间通常用于做性能测试&#xff0c;一般用于检查HTTP请求的响应时间是否超过预期值。而这个响应时间是性能测试中常关注的一个性能指标。 一、添加断言方式 根据需要可在【测试计划】、【线程组】、【线程请求】下添加…

VMware Horizon 8 运维系列(三)win10设置共享桌面图标

前言 在win10模板上用管理员帐号安装好软件之后&#xff0c;有的软件快捷图标不会出现在桌面上&#xff0c;有的即使有在桌面上出现&#xff0c;但是当发布云桌面池后&#xff0c;客户端登录的都是不同的域用户&#xff0c;当不同的用户登录系统的时候&#xff0c;很多软件快捷…

端粒/端粒酶生信切入点,6+端粒酶+泛癌+甲基化+实验。

今天给同学们分享一篇端粒酶泛癌甲基化实验的生信文章“Genomic, epigenomic, and transcriptomic signatures for telomerase complex components: a pan‐cancer analysis”&#xff0c;这篇文章于2022年10月31日发表在Mol Oncol期刊上&#xff0c;影响因子为6.6。 激活端粒酶…

提高战斗力+分享游戏干货,带你解锁无敌吃鸡技巧!

大家好&#xff01;作为吃鸡行家&#xff0c;我今天要和大家聊一些热门话题&#xff0c;包括如何提高战斗力和分享游戏干货&#xff0c;以及吃鸡作图、装备查询等技巧。 首先&#xff0c;让我们来谈谈提高战斗力。在绝地求生&#xff08;PUBG&#xff09;等吃鸡游戏中&#xff…

Flink---11、状态管理(按键分区状态(值状态、列表状态、Map状态、归约状态、聚合状态)算子状态(列表状态、广播状态))

星光下的赶路人star的个人主页 这世上唯一扛得住岁月摧残的就是才华 文章目录 1、状态管理1.1 Flink中的状态1.1.1 概述1.1.2 状态的分类 1.2 按键分区状态&#xff08;Keyed State&#xff09;1.2.1 值状态&#xff08;ValueState&#xff09;1.2.2 列表状态&#xff08;ListS…

H5逆向之远程RPC

引言前一讲说过H5 怎么去抓包,逆向分析。其中说到RPC。这一节详细讲一下。有一种情况,JS 比较复杂,混淆的厉害。 这个时候就用到RPC。原理就是,hook web 浏览器,直接调用js 里边的方法。 Node 服务。为什么用到Node 服务,先来看下这架构 Node 对外提供各种接口,外部可以…

【算法分析与设计】回溯法(下)

目录 一、符号三角形问题二、N皇后问题三、0-1背包问题四、最大团问题4.1 进一步改进 五、图的m着色问题5.1 算法设计六、旅行售货员问题七、连续邮资问题八、回溯法效率分析九、重排原理十、回溯法的效率分析十一、Monte Carlo方法附一、四后问题的搜索树附二、随机选择路径附…

竞赛选题 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

iTunes更新iOS17出现发生未知错误4000的原因和解决方案

有不少人使用iTunes更新iOS 17时出现「无法更新iPhone发生未知的错误4000」的错误提示&#xff0c;不仅不知道iTunes升级失败的原因&#xff0c;也无从解决iPhone无法更新4000的问题。 小编今天就分享iPhone更新iOS系统出现4000错误提示的原因和对应的解决方案。 为什么iPhone…

桥梁安全在线监测预警系统解决方案

在我们的日常生活中&#xff0c;桥梁作为重要的交通枢纽&#xff0c;其安全性与稳定性至关重要。然而&#xff0c;桥梁由于其所处的特殊环境以及复杂的施工过程&#xff0c;往往容易受到各种因素的影响。最近频繁发生的桥梁施工事故引起了人们的广泛关注。这些事故的原因可能各…

机器视觉工程师,我们上班的意义在哪里?

很多朋友&#xff0c;现在不是自己想做的工作&#xff0c;那你做这份工作干什么&#xff1f;担心自己没有竞争力&#xff0c;担心自己被替代。上班的意义是完成自己头脑和资源的原始积累&#xff0c;迈向下一级人生游戏;我最终要靠自己本事吃饭&#xff0c;而不是一直待在这个只…

【yaml文件的编写】

yaml文件编写 YAML语法格式写一个yaml文件demo创建资源对象查看创建的pod资源创建service服务对外提供访问并测试创建资源对象查看创建的service在浏览器输入 nodeIP:nodePort 即可访问 详解k8s中的port&#xff1a;portnodePorttargetPortcontainerPortkubectl run --dry-runc…

【b站韩顺平 快速学Java课】(超详细)安装完JDK后的环境变量配置教程 总结

安装JDK8&#xff08;包括JRE8&#xff09;教程笔记看这个&#xff1a;http://t.csdnimg.cn/QVPXf 1.为什么要配置环境变量&#xff1a; 拿我之前安装完JDK8但是还没配置环境变量的时候的情况举例&#xff1a; &#xff08;1&#xff09;winR输入cmd打开控制台 &#xff08;…

windows2003远程访问tscc.msc[终端服务配置\连接]选项卡为灰色,怎么样才能使其可配置

&#xff08;计算机配置\管理模板\windows 组件\终端服务\会话&#xff09;设置一下。 全部改成未被配置就对了 gpedit.msc

Eastern Exhibition【中位数 距离和的最小值】

Eastern Exhibition【中位数 距离和的最小值】 题意翻译 二维平面上有 n 个点&#xff0c;要找一个点&#xff0c;使得所有点到它的曼哈顿距离&#xff08; x 和 y 的坐标差距之和&#xff09;之和最小。请问有几个满足该要求的点&#xff1f; 输入输出样例 输入 #1 6 3 0 0 2 …

吃鸡必备神器!提升战斗力,分享顶级游戏干货!

绝地求生已经成为了一款风靡全球的游戏&#xff0c;为了帮助各位吃鸡爱好者提升战斗力&#xff0c;闪电般获得胜利&#xff0c;我们特地整理了一些神器和干货&#xff0c;与大家分享。 首先&#xff0c;为了方便大家进行吃鸡作图&#xff0c;我们推荐了几款绝地求生作图工具。这…

【轻松玩转MacOS】数据备份篇

引言 为什么要备份数据&#xff1f; 想象一下&#xff0c;你正在享受MacOS带来的便捷与高效&#xff0c;突然电脑崩溃了&#xff0c;或者你的硬盘坏了。这个时候&#xff0c;你可能会痛不欲生&#xff0c;因为你的所有数据都在里面。这就是为什么我们需要定期备份数据的原因。记…

NPM 常用命令(十)

目录 1、npm prefix 1.1 使用语法 1.2 描述 1.3 示例 2、npm prune 2.1 使用语法 2.1 描述 3、npm publish 3.1 使用语法 3.2 描述 包中包含的文件 4、npm query 4.1 使用语法 4.2 描述 4.3 示例 5、npm rebuild 5.1 使用语法 5.2 描述 6、npm repo 6.1 使…

基于卷积神经网络的图像识别-案例实施1

案例描述 学习如何搭建CNN卷积神经网络&#xff0c;训练cifar-10数据&#xff0c;识别图片中的内容。 案例分析 cifar-10是由Hinton的学生Alex Krizhevsky和Ilya Sutskever整理的一个用于识别普适物体的小型数据集。一共包含 10个类别的 RGB 彩色图 片&#xff1a;飞机&…

vscode的窗口下拉显示行数不够

这是为了减少程序的空间占用而存在的一个设置。设置一下即可。 设置方法 在左上角文件&#xff0c;个人设置&#xff0c;设置中&#xff0c;&#xff08;或者用Ctrl&#xff0c;打开&#xff09; 输入terminal&#xff0c;找到bell duration&#xff0c;设置成1000。 参考…