Django从0到视图开发实战
创始人
2025-05-30 19:34:14

Djanogo框架特点

  • Django 是一个全栈web框架
  • 功能完善,要素齐全
  • 完善的文档
  • 强大的数据库访问API
  • 灵活的路由系统
  • 丰富的Template模板功能
  • 自带后台管理应用admin

Django框架安装

pip install Django

设计模型

MVC设计模型

MVC是一种常用的软件架构模式,它将应用程序分为三个相互独立的部分:模型(Model)、视图(View)和控制器(Controller),每个部分有不同的责任和职责。

  1. 模型(Model)

模型是应用程序中的数据和业务逻辑部分,它通常表示应用程序中的核心功能和数据。模型负责处理应用程序的数据,并对其进行逻辑操作。模型与具体的数据存储方式无关,可以使用各种不同的数据存储方式,如关系型数据库、非关系型数据库、文件系统等。

  1. 视图(View)

视图是应用程序中的用户界面部分,它负责呈现模型数据给用户,并处理用户输入。视图通常由HTML、CSS、JavaScript等技术实现,并将模型的数据呈现给用户。视图可以根据用户的不同需求和设备类型,以不同的方式呈现模型数据。

  1. 控制器(Controller)

控制器是应用程序中的业务逻辑部分,它负责接收和处理用户的输入,并更新模型和视图。控制器负责将视图和模型连接起来,并协调它们的工作。控制器通常由代码实现,可以响应用户的请求,并将结果返回给视图。

Django中的MTV模型

MTV是Model-Template-View的简称,是一种Web应用程序设计模型,类似于MVC(Model-View-Controller)模型。它是Django框架的核心设计思想之一,用于组织和管理Web应用程序的不同部分。

MTV模型中的三个部分如下:

  1. 模型(Model)

模型负责与数据库进行交互,定义数据的结构和行为,并提供查询和修改等方法。在Django中,模型通常使用ORM(Object-Relational Mapping)进行实现,即将数据库中的表映射为Python对象,方便使用和管理。

  1. 模板(Template)

模板是用于呈现数据的视图组件,它将数据和HTML等页面元素组合起来,呈现给用户。模板通常包括各种模板标签和模板过滤器等,用于控制页面的显示和格式。

  1. 视图(View)

视图是Web应用程序的核心处理逻辑,负责处理用户请求和数据响应等。视图接收用户请求,根据请求的不同,调用模型进行数据查询和修改,并将结果呈现给模板进行渲染和显示。视图通常包括请求处理函数和视图类等,用于实现各种业务逻辑和处理方式。

MTV模型中还有一些其他的概念和组件:

  1. URL路由(URL Routing)

URL路由是将用户请求与视图函数或类进行匹配的过程,它根据请求的URL地址,将请求转发给相应的视图进行处理。在Django中,URL路由通常通过URLconf(URL Configuration)进行配置和管理。

  1. 中间件(Middleware)

中间件是位于请求和响应之间的一组处理函数,它可以在请求被处理之前和之后进行一些预处理和后处理操作。中间件可以用于请求日志、错误处理、权限验证等方面。

  1. 表单(Form)

表单是用于在视图中处理用户输入的数据的组件,它提供了一种方便的方式来接收、验证和处理用户提交的数据。在Django中,表单通常通过Form类进行定义和实现。

  1. 静态文件(Static Files)

静态文件是Web应用程序中用于呈现页面的一些资源文件,如CSS、JavaScript、图片等。Django提供了一种方便的方式来管理和呈现静态文件,可以通过STATIC_URL和STATICFILES_DIRS等设置来进行管理。

Django常用命令

Django是一个高效的Web开发框架,提供了一系列命令来快速构建和管理Web应用程序。以下是一些常用的Django命令:

  1. 创建项目:django-admin startproject projectname,用于创建一个新的Django项目。
  2. 创建应用:python manage.py startapp appname,用于创建一个新的Django应用程序。
  3. 启动服务器:python manage.py runserver,用于启动Django服务器,以便在本地环境中测试和调试Web应用程序。
  4. 数据库迁移:python manage.py makemigrationspython manage.py migrate,用于在数据库中创建新的表或更改现有表的结构。
  5. 清空数据库:python manage.py flush,用于清空整个数据库中的所有数据,谨慎使用。
  6. 查看路由表:python manage.py show_urls,用于查看当前项目的路由表和视图函数。
  7. 运行单元测试:python manage.py test,用于运行项目的单元测试,以确保项目的稳定性和正确性。
  8. 创建管理员命令:python manage.py create_command,用于创建自定义的管理命令,方便对Web应用程序进行管理和操作。
  9. 收集静态文件:python manage.py collectstatic,用于将项目中的静态文件收集到指定的目录中,以便于部署和发布Web应用程序。
  10. 显示当前安装的Django版本:python -m django version,用于显示当前安装的Django版本号。

在这里插入图片描述
在这里插入图片描述

Django目录结构介绍

Django的目录结构如下:

project_name/manage.pyproject_name/__init__.pysettings.pyurls.pyasgi.pywsgi.py
  1. manage.py:Django命令行工具,用于执行与项目相关的任务,例如运行开发服务器、创建数据库等。

  2. project_name/settings.py:Django项目的设置文件,包含配置项目的所有设置,例如数据库、静态文件路径、应用程序、中间件等。

  3. project_name/urls.py:Django项目的URL配置文件,包含URL模式和视图函数的映射关系。

  4. project_name/asgi.py:用于ASGI(异步服务器网关接口)服务器的入口点,通常用于生产环境。

  5. project_name/wsgi.py:用于WSGI(Web服务器网关接口)服务器的入口点,通常用于生产环境。

开始第一个hello world

首先需要了解Django中项目和app的关系:

  • 一个app实现某个具体功能;
  • 一个project是配置文件和多个app的集合,这些app组合成整个站点;
  • 一个project可以包含多个app;

创建一个简单项目可以按照如下步骤:

  1. 创建一个project,django-admin startproject myproject
  2. 创建一个app,python manage.py startapp testapp
  3. 将app加入到setting中
    在这里插入图片描述
  4. 编写app的view
    在这里插入图片描述
  5. project和app进行关联,编写路由
    在这里插入图片描述
  6. 启动项目进行访问,python .\manage.py runserver 8080
    在这里插入图片描述

Django数据模型

字段类型和关键字

  1. 常用的字段类型映射关系,字段类型
  • IntegerField : 整型,映射到数据库中的int类型。
  • CharField: 字符类型,映射到数据库中的varchar类型,通过max_length指定最大长度。
  • TextField: 文本类型,映射到数据库中的text类型。
  • BooleanField: 布尔类型,映射到数据库中的tinyint类型,在使用的时候,传递True/False进去。如果要可以为空,则用NullBooleanField。
  • DateField: 日期类型,没有时间。映射到数据库中是date类型, 在使用的时候,可以设置DateField.auto_now每次保存对象时,自动设置该字段为当前时间。
  • DateTimeField: 日期时间类型。映射到数据库中的是datetime类型,在使用的时候,传递datetime.datetime()进去。
  1. Field的常用参数:
  • primary_key: 指定是否为主键。
  • unique: 指定是否唯一。
  • null: 指定是否为空,默认为False。
  • blank: 等于True时form表单验证时可以为空,默认为False。
  • default: 设置默认值。
  • DateField.auto_now: 每次修改都会将当前时间更新进去
  • DateField.auto_now_add: 第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值

数据迁移

首先创建模型的代码
在这里插入图片描述

  • 使用如下命令将模型转成迁移文件:python manage.py makemigrations
  • 使用如下命令进行迁移:python manage.py migrate
  • 如下命令查看具体转换成的表:python .\manage.py sqlmigrate testapp 0001
    在这里插入图片描述

如需同步到SQL数据库可以如下步骤:

  1. 配置seting文件中的数据库信息
DATABASES = {'default': {  'ENGINE': 'django.db.backends.mysql','NAME': 'blog', #你的数据库名称 数据库需要自己提前建好'USER': 'root', #你的数据库用户名'PASSWORD': '', #你的数据库密码'HOST': '', #你的数据库主机,留空默认为localhost'PORT': '3306', #你的数据库端口}
}
  1. 生成迁移文件 python manage.py makemigrations
  2. 进行迁移 python manage.py migrate

去数据库检查看到表信息同步到了数据库
)

Django Model数据的增删改查

  1. 新增
def orm_add(request):# 第一种方式TestModel.objects.create(name="张三",age=18)# 第二种方式obj = TestModel(name='李四', age=20)obj.save()# 第三种方式dict1={'name':'王五','age':30}TestModel.objects.create(**dict1)return HttpResponse("数据添加成功!")

将该方法加入到路由中将得到如下的结果:
在这里插入图片描述
2. 更新

def orm_update(request):# 第一种obj = TestModel.objects.get(id=1)obj.name = 'dapeng'obj.save()# 第二种TestModel.objects.filter(id=2).update(name='test')return HttpResponse("数据修改成功!")
  1. 查询
def orm_get(request):# 查所有all_list = TestModel.objects.all()# 查单条all_list = TestModel.objects.get(id=1)all_list = TestModel.objects.get(name="test")# filterall_list = TestModel.objects.filter(name="张三")all_list = TestModel.objects.filter(name="张三")[:2]# 排序# 使用-倒叙排序all_list =TestModel.objects.order_by('-id')all_list = TestModel.objects.filter(name="张三").order_by('-id')res = ""for var in all_list:res += var.name + " "return HttpResponse("

"+res+"

")

如下图是从查询张三的结果中提取头两个数据:

在这里插入图片描述
4. 删除

def orm_delete(request):obj = TestModel.objects.get(id=1)obj.delete()return HttpResponse("数据删除成功!")
  1. 其他
    如果没有获取数据则返回404
def orm_get_object(request):get_object_or_404(TestModel,id=20)

如果没有获取数据则创建

def orm_get_create(request):TestModel.objects.get_or_create(name="sunpeng")return HttpResponse("如果数据不存在则新建")
  1. 复杂查询

一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,例如下面代码:

Book.objects.filter(price__gte=70, title__startswith="J")

随着我们的程序越来越复杂,查询的条件也跟着复杂起来,这样简单的通过一个filter()来进行查询的条件将导致我们的查询越来越长。当我们在查询的条件中需要组合条件时(例如两个条件“且”或者“或”)时。我们可以使用Q()查询对象。例如下面的代码:

from django.db.models import Q
q1 = Q(price__gte=70)
q2 = Q(title__startswith="J")

这样就生成了一个Q()对象,我们可以使用符号&(且)或者|(或)或者~(非)多个Q()对象组合起来传递给filter(),exclude(),get()等函数。当多个Q()对象组合起来时,Django会自动生成一个新的Q()。例如下面代码就将两个条件组合成了一个:

Q(price__gte=70) | Q(title__startswith="J")

多个Q()对象之间的关系Django会自动理解成“且(and)”关系,例如下面的代码:

Book.objects.filter(Q(id__gt=6), Q(price__gte=70) | Q(title__startswith="J"))

此外,Q()对象可以结合关键字参数一起传递给查询函数,不过需要注意的是要将Q()对象放在关键字参数的前面,例如下面的代码:

Book.objects.filter(Q(id__gt=6), Q(price__gte=70) | Q(title__startswith='J'), author__icontains='jack')

以下为常用的语法说明:
在这里插入图片描述

Django路由

在Django中请求通过中间件转发送给URL分发器,URL转发给View。ViewModel中获取数据,或者从template中获取数据,然后返回给中间件返回结果。
在这里插入图片描述
Django 路由在 urls.py 配置,urls.py 中的每一条配置对应相应的处理方法。一个路由配置模块就是一个urlpatterns列表,列表的每个元素都是一项path,每一项path都是以path()的形式存在。path()方法可以接收4个参数,其中前2个是必须的:route和view,以及2个可选的参数:kwargs和name。
在这里插入图片描述

路由语法

  1. 在Django中,可以通过为路由规则指定一个名称来命名该路由规则。例如:
from django.urls import path
from . import viewsurlpatterns = [path('blog/', views.blog_list, name='blog_list'),path('blog//', views.blog_detail, name='blog_detail'),
]

在上面的例子中,name参数为路由规则指定了别名。需要使用时,可以使用该名称找到对应的路由,例如:

def goto(request):if request.method=='GET':# 重定向到外链return redirect('https://www.baidu.com')elif request.method=='POST':# 重定向到内部路由return redirect('blog_detail')else:HttpResponse("xxx")

在上面的例子中,reverse函数根据名称生成URL。参数args表示传递的动态参数。在这里,生成的URL是/blog/1/

  1. 使用正则表达式

在Django中,路由规则是使用正则表达式进行匹配的。可以使用正则表达式的语法来定义路由规则。例如:

from django.urls import path
from . import viewsurlpatterns = [path('blog////', views.blog_detail, name='blog_detail'),
]

在上面的例子中,使用了正则表达式的语法来定义路由规则。是动态参数,表示传递一个整数类型的参数到blog_detail视图函数中。是一个动态参数,表示传递一个slug类型的参数到blog_detail视图函数中。

  1. 使用通配符

在Django中,可以使用通配符来匹配任意字符。通配符用*表示。例如:

from django.urls import path
from . import viewsurlpatterns = [path('blog/*/', views.blog_list, name='blog_list'),
]

在上面的例子中,使用通配符*来匹配URL中的任意字符。这意味着所有以/blog/开头的URL都将被匹配到。

  1. 在视图函数中获取参数

在Django中,可以在视图函数中通过参数来获取路由中的动态参数。例如:

from django.shortcuts import renderdef blog_detail(request, year, month, slug):# 使用year、month和slug参数来查询博客文章#

路由转发

通常,建议是在每个app里,各自创建一个urls.py路由模块,然后从根路由出发,将app所属的url请求,全部转发到相应的urls.py模块中。
在这里插入图片描述

Django视图函数

视图函数,简称视图,本质上是一个Python函数,它接受Web请求并且返回Web响应。

Django View视图层:Request对象

request对象请求相关的常用属性

  • method 表示请求中使用的HTTP方法的字符串,用大写表示
  • GET 类似于字典的对象,包含所有给定的HTTP GET参数
  • POST 类似字典的对象,包含所有给定的HTTP POST参数,前提是请求包含表单数据
  • path_info 返回用户访问url,不包括域名
  • body 请求体(bytes类型),request.POST的数据就是从body里面提取到的
    在这里插入图片描述

Django View视图层:redirect()重定向方法

语法:redirect(to, args, permanent=False, *kwargs),根据传递进来的url参数,返回HttpResponseRedirect。

def goto(request):if request.method=='GET':# 重定向到外链return redirect('https://www.baidu.com')

相关内容

热门资讯

Spring Cloud之一:... 目录 环境 Eureka工程的创建步骤 系列目录(持续更新。。。) S...
golang实现守护进程(2) 前言golang实现守护进程,包含功能:1. 守护进程只创建一次2. 平...
url 格式详解 统一资源定位系统(uniform resource locator; url ...
elasticsearch7.... elasticsearch版本:7.17.3 目标:实现对类型为text...
SpringBoot 加载系统... 开发环境: IDEA 2022.1.4+ MyBatis         代码参考:spri...
交换机概念和知识和命令 目录 一、华为交换机基础学习的一些重要概念和知识 二、交换机常用命令大全 三、不常用的交换机命令 ...
什么是 JavaScript ... 本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻࿰...
【C++】C++11——lam... 文章目录一、Lambda表达式引入二、Lambda表达式语法三、Lambda表达式交换两个值四、La...
Java分布式事务(十) 文章目录🔥分布式架构的理论知识_BASE理论🔥分布式事务解决方案_最...
vmware中centos7实... 前言 在开发收银系统SAAS版本时,采用的是centos服务器,经常需要...
计算机图形学 | 可编程渲染管... 计算机图形学 | 可编程渲染管线计算机图形学 | 可编程渲染管线3.1 从固定到可编程图形编程的发展...
linux下安装两个或多个to... 安装jdk,tomcat编辑环境变量profilevi /etc/profile加入以...
selenium的显示等待、隐... 关于selenium有三种等待方式,分别为显示等待、隐式等待、强制等待 1、强制等待 ...
测牛学堂:软件测试接口自动化之... requests库 用postman进行接口测试有一定的限制,我们测试更应该掌握的是用...
day36_jdbc 今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客...
【java基础】Stream流... 文章目录基本介绍流的创建流的各种常见操作forEach方法filter方法map方法peek方法fl...
幂等性通用组件 一、什么是幂等性幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,...
Nacos服务注册 又是美好的一天呀~ 个人博客地址: huanghong.top 本文预估阅读时长为3...
令人惊艳的ChatGPT项目,... 自从 ChatGPT、Stable Diffusion 发布以来,各种相关开源项目百花...
舆情监测系统有哪些优势,TOO... 舆情监测系统是一种基于大数据技术的舆情分析工具,可以帮助企业、政府等机构实时监控公众对...
【Linux】基础IO流(上) 文章目录1. 预备知识2. 回忆C接口fopenfputsfprintfsnprintf追加方式——...
设计模式(二十七)----行为... 1 概述 如上图,设计一个软件用来进行加减计算。我们第一想法就是使用工具类ÿ...
精心整理前端主流框架学习路径 版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog....
typescript声明 前言 “d.ts”文件用于为 TypeScript 提供有关用 JavaScript 编写的 API...
HashMap源码分析 Java源码系列:下方连接 http://t.csdn.cn/Nwzed 文章目录...
一、基础算法3:二分 模板题+... 文章目录算法模板整数二分算法模板浮点数二分算法模板模板题数的范围原题链接题目题解数的三次方根原题链接...
Essential C++复习... 好久没写代码了,很多东西都忘记了。复盘一下C++编写基础头文件 与 输...
三十五、DRF中的过滤、Dja... 一、DRF中的过滤 REST framework 的通用列表视图的默认行为是返回模型管理器的整个查询...
基于RZ/G2UL Corte... 以太网接口是一种广泛应用的网络接口,它可以在不同的场合实现不同的功能。例如࿰...
nginx-会话保持-3 基于LNMP在负载均衡集群上部署wordpress(低配版) 在讲解会话...