pip install Django
MVC是一种常用的软件架构模式,它将应用程序分为三个相互独立的部分:模型(Model)、视图(View)和控制器(Controller),每个部分有不同的责任和职责。
模型是应用程序中的数据和业务逻辑部分,它通常表示应用程序中的核心功能和数据。模型负责处理应用程序的数据,并对其进行逻辑操作。模型与具体的数据存储方式无关,可以使用各种不同的数据存储方式,如关系型数据库、非关系型数据库、文件系统等。
视图是应用程序中的用户界面部分,它负责呈现模型数据给用户,并处理用户输入。视图通常由HTML、CSS、JavaScript等技术实现,并将模型的数据呈现给用户。视图可以根据用户的不同需求和设备类型,以不同的方式呈现模型数据。
控制器是应用程序中的业务逻辑部分,它负责接收和处理用户的输入,并更新模型和视图。控制器负责将视图和模型连接起来,并协调它们的工作。控制器通常由代码实现,可以响应用户的请求,并将结果返回给视图。
MTV是Model-Template-View的简称,是一种Web应用程序设计模型,类似于MVC(Model-View-Controller)模型。它是Django框架的核心设计思想之一,用于组织和管理Web应用程序的不同部分。
MTV模型中的三个部分如下:
模型负责与数据库进行交互,定义数据的结构和行为,并提供查询和修改等方法。在Django中,模型通常使用ORM(Object-Relational Mapping)进行实现,即将数据库中的表映射为Python对象,方便使用和管理。
模板是用于呈现数据的视图组件,它将数据和HTML等页面元素组合起来,呈现给用户。模板通常包括各种模板标签和模板过滤器等,用于控制页面的显示和格式。
视图是Web应用程序的核心处理逻辑,负责处理用户请求和数据响应等。视图接收用户请求,根据请求的不同,调用模型进行数据查询和修改,并将结果呈现给模板进行渲染和显示。视图通常包括请求处理函数和视图类等,用于实现各种业务逻辑和处理方式。
MTV模型中还有一些其他的概念和组件:
URL路由是将用户请求与视图函数或类进行匹配的过程,它根据请求的URL地址,将请求转发给相应的视图进行处理。在Django中,URL路由通常通过URLconf(URL Configuration)进行配置和管理。
中间件是位于请求和响应之间的一组处理函数,它可以在请求被处理之前和之后进行一些预处理和后处理操作。中间件可以用于请求日志、错误处理、权限验证等方面。
表单是用于在视图中处理用户输入的数据的组件,它提供了一种方便的方式来接收、验证和处理用户提交的数据。在Django中,表单通常通过Form类进行定义和实现。
静态文件是Web应用程序中用于呈现页面的一些资源文件,如CSS、JavaScript、图片等。Django提供了一种方便的方式来管理和呈现静态文件,可以通过STATIC_URL和STATICFILES_DIRS等设置来进行管理。
Django是一个高效的Web开发框架,提供了一系列命令来快速构建和管理Web应用程序。以下是一些常用的Django命令:
django-admin startproject projectname
,用于创建一个新的Django项目。python manage.py startapp appname
,用于创建一个新的Django应用程序。python manage.py runserver
,用于启动Django服务器,以便在本地环境中测试和调试Web应用程序。python manage.py makemigrations
和python manage.py migrate
,用于在数据库中创建新的表或更改现有表的结构。python manage.py flush
,用于清空整个数据库中的所有数据,谨慎使用。python manage.py show_urls
,用于查看当前项目的路由表和视图函数。python manage.py test
,用于运行项目的单元测试,以确保项目的稳定性和正确性。python manage.py create_command
,用于创建自定义的管理命令,方便对Web应用程序进行管理和操作。python manage.py collectstatic
,用于将项目中的静态文件收集到指定的目录中,以便于部署和发布Web应用程序。python -m django version
,用于显示当前安装的Django版本号。
Django的目录结构如下:
project_name/manage.pyproject_name/__init__.pysettings.pyurls.pyasgi.pywsgi.py
manage.py
:Django命令行工具,用于执行与项目相关的任务,例如运行开发服务器、创建数据库等。
project_name/settings.py
:Django项目的设置文件,包含配置项目的所有设置,例如数据库、静态文件路径、应用程序、中间件等。
project_name/urls.py
:Django项目的URL配置文件,包含URL模式和视图函数的映射关系。
project_name/asgi.py
:用于ASGI(异步服务器网关接口)服务器的入口点,通常用于生产环境。
project_name/wsgi.py
:用于WSGI(Web服务器网关接口)服务器的入口点,通常用于生产环境。
首先需要了解Django中项目和app的关系:
创建一个简单项目可以按照如下步骤:
django-admin startproject myproject
python manage.py startapp testapp
python .\manage.py runserver 8080
首先创建模型的代码
python manage.py makemigrations
python manage.py migrate
python .\manage.py sqlmigrate testapp 0001
如需同步到SQL数据库可以如下步骤:
DATABASES = {'default': { 'ENGINE': 'django.db.backends.mysql','NAME': 'blog', #你的数据库名称 数据库需要自己提前建好'USER': 'root', #你的数据库用户名'PASSWORD': '', #你的数据库密码'HOST': '', #你的数据库主机,留空默认为localhost'PORT': '3306', #你的数据库端口}
}
python manage.py makemigrations
python manage.py migrate
去数据库检查看到表信息同步到了数据库
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("数据修改成功!")
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("数据删除成功!")
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("如果数据不存在则新建")
一般我们在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中请求通过中间件转发送给URL分发器,URL转发给View。ViewModel中获取数据,或者从template中获取数据,然后返回给中间件返回结果。
Django 路由在 urls.py 配置,urls.py 中的每一条配置对应相应的处理方法。一个路由配置模块就是一个urlpatterns列表,列表的每个元素都是一项path,每一项path都是以path()的形式存在。path()方法可以接收4个参数,其中前2个是必须的:route和view,以及2个可选的参数:kwargs和name。
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/
。
在Django中,路由规则是使用正则表达式进行匹配的。可以使用正则表达式的语法来定义路由规则。例如:
from django.urls import path
from . import viewsurlpatterns = [path('blog////', views.blog_detail, name='blog_detail'),
]
在上面的例子中,使用了正则表达式的语法来定义路由规则。
和
是动态参数,表示传递一个整数类型的参数到blog_detail
视图函数中。
是一个动态参数,表示传递一个slug类型的参数到blog_detail
视图函数中。
在Django中,可以使用通配符来匹配任意字符。通配符用*
表示。例如:
from django.urls import path
from . import viewsurlpatterns = [path('blog/*/', views.blog_list, name='blog_list'),
]
在上面的例子中,使用通配符*
来匹配URL中的任意字符。这意味着所有以/blog/
开头的URL都将被匹配到。
在Django中,可以在视图函数中通过参数来获取路由中的动态参数。例如:
from django.shortcuts import renderdef blog_detail(request, year, month, slug):# 使用year、month和slug参数来查询博客文章#
通常,建议是在每个app里,各自创建一个urls.py路由模块,然后从根路由出发,将app所属的url请求,全部转发到相应的urls.py模块中。
视图函数,简称视图,本质上是一个Python函数,它接受Web请求并且返回Web响应。
request对象请求相关的常用属性
语法:redirect(to, args, permanent=False, *kwargs),根据传递进来的url参数,返回HttpResponseRedirect。
def goto(request):if request.method=='GET':# 重定向到外链return redirect('https://www.baidu.com')