Django框架基础知识概述
1. Django安装
- 使用pip安装django
正常使用pip安装django:
pip install django
这样默认会从pypi的服务器下载django包,速度比较慢。
2. 使用国内镜像源
可以使用豆瓣的pypi镜像源来安装:
pip install -i https://pypi.doubanio.com/simple/ django
或使用阿里云的镜像源:
pip install -i http://mirrors.aliyun.com/pypi/simple/ django
- 检查安装版本
安装完成后的版本号:
python -m django --version
2. Django项目创建
使用django-admin创建项目
运行命令django-admin startproject projectname
可以创建一个项目,projectname是项目名称。
这个命令会生成一个项目目录,包含初始化的项目文件。
项目目录结构
生成的项目目录包含:
- manage.py: 管理工具脚本
- projectname/: 项目包
- init.py: 初始化文件
- settings.py: 项目配置
- urls.py: URL声明
- wsgi.py: WSGI服务器入口
settings.py配置
settings.py包含了项目的所有配置,比如INSTALLED_APPS、数据库连接、语言等配置。
启动开发服务器
可以通过python manage.py runserver
启动项目的开发服务器,用于开发调试。
3. Django应用创建
Django项目由一个或多个应用组成,每个应用实现特定功能。
在项目中创建应用
可以使用命令python manage.py startapp app01
来创建一个应用。
这个命令会生成一个应用目录及初始化文件。
应用目录结构
一个应用通常包含以下文件:
- views.py: 视图逻辑
- models.py: 数据模型
- tests.py: 测试用例
- apps.py: 应用配置
注册应用
创建完应用需要在settings.py的INSTALLED_APPS中注册该应用,才能被Django项目使用。
例如:
INSTALLED_APPS = [
'app01',
...
]
创建应用是按功能拆分项目的重要方式。应用包含独立功能的代码和文件,需要注册才能启用。这样可以构建模块化、可扩展的项目。
django配置文件的使用
Django配置文件是一个Python文件,通常命名为settings.py
,用于配置Django项目的各种设置和选项。以下是一些常用的Django配置选项:
1.注册APP/应用
在 Django 中,每个应用程序都被视为一个独立的模块,包含了一些特定的 Python 代码和模板文件。通过将应用程序的模块路径添加到 INSTALLED_APPS
列表中,Django 可以找到并加载这些应用程序,以便在项目中使用。
以下是一个示例的 INSTALLED_APPS
列表:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 注册APP01
'app01',# 自己创建的app
]
在这个示例中,django.contrib.admin
、django.contrib.auth
等内置应用程序的模块路径被添加到了 INSTALLED_APPS
列表中。此外,还添加了一个名为 app01
的第三方应用程序的模块路径。通过添加这些模块路径,Django 将自动加载并安装这些应用程序,以便在项目中可以使用它们。
2.中间件
中间件是一种可插入的组件,它能够在一个请求/响应循环中拦截和处理请求或响应。通过使用中间件,你可以在请求被处理之前和之后执行自定义的逻辑,例如身份验证、授权、日志记录等。
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",#跨站请求伪造(CSRF)保护、点击劫持防护、密码重置功能等。
"django.contrib.sessions.middleware.SessionMiddleware",#责处理用户的会话。它将在每个请求中查找会话信息,并将其添加到请求对象中。如果会话不存在,它将在服务器上创建一个新的会话。
"django.middleware.common.CommonMiddleware",#包含了一些通用的处理逻辑,例如重定向、静态文件服务等。
"django.middleware.csrf.CsrfViewMiddleware",#提供了跨站请求伪造(CSRF)保护。它将在每个视图函数中检查请求中是否存在有效的CSRF令牌。如果没有,它将返回一个错误响应。
"django.contrib.auth.middleware.AuthenticationMiddleware",#负责处理用户的认证。它将在每个视图函数中检查请求中是否存在有效的用户认证信息。如果没有,它将重定向到登录页面。
"django.contrib.messages.middleware.MessageMiddleware",#负责处理消息提示。它将在每个视图函数中检查请求中是否存在需要显示的消息提示,并将其添加到请求对象中。
"django.middleware.clickjacking.XFrameOptionsMiddleware",#提供了点击劫持防护。它将在每个响应中添加X-Frame-Options头,以防止页面被嵌入到其他页面中。
"app01.MD1.MD1"#自己写的中间件
]
3. 配置HTML模板
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"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",
],
},
},
]
BACKEND
:这里是Django默认的模板,也就是django.template.backends.django.DjangoTemplates
。DIRS
:一个列表,指定了模板搜索的目录。这里没有指定任何目录,所以Django会使用默认的设置。APP_DIRS
:这个选项决定了Django是否会搜索每个已安装的应用的模板目录。如果设为True(这是默认值),Django会在每个已安装的应用的templates
目录下查找模板。OPTIONS
:这是一个包含模板选项的字典。这里定义了context_processors
,这是用于生成模板上下文的处理器。这些处理器会为每个请求生成一个上下文,该上下文可以在模板中使用。
4.数据库配置
# 定义一个名为 DATABASES 的字典,用于存储数据库配置信息
DATABASES = {
# 定义一个名为 "default" 的数据库配置,这是默认使用的数据库配置
"default": {
# 指定数据库引擎,这里使用的是 Django 默认的 MySQL 数据库引擎
"ENGINE": "django.db.backends.mysql",
# 指定数据库名称,这里命名为 "xmm"
"NAME":"xmm",
# 指定连接数据库的用户名,这里使用的是 "admin"
"USER":"admin",
# 指定连接数据库的密码,这里使用的是 "123456"
"PASSWORD":"123456",
# 指定数据库服务器地址,这里使用的是本地地址 "127.0.0.1"
"HOST":"127.0.0.1",
}
}
5.语言
LANGUAGE_CODE = "en-us"#英文
LANGUAGE_CODE = "zh-cn"#中文
6.静态文件
STATIC_URL = "static/"
7.媒体文件
MEDIA_URL = “media/”
4.django视图
- 函数视图(Function View): 最简单的视图,就是一个接收request参数、返回response对象的Python函数。
def index(request):
return HttpResponse('Hello World')
- 类视图(Class-based View): 基于类的视图,可以通过继承重用代码。Django提供了许多内置的通用类视图。
from django.views.generic import TemplateView
class IndexView(TemplateView):
template_name = 'index.html'
- 装饰器视图(Decorator View): 通过装饰器为视图函数添加额外功能,如登录验证等。
from django.contrib.auth.decorators import login_required
@login_required
def index(request):
pass
4.我常用的视图
- reverse用于根据视图名称、URL参数等反向生成URL,通常用于重定向或者模板中的URL
- render用于结合给定的模板和上下文渲染出一个HttpResponse响应。
- redirect用于重定向到一个指定的URL。
在Django中,reverse
是一个用于反向解析URL的函数。它允许您通过名称和参数来生成一个URL。这对于在代码中构建动态URL非常有用。
reverse
:生成动态URL
下面是一个示例,展示如何使用reverse
函数:
from django.urls import reverse
# 假设您有一个名为"post_detail"的视图函数,对应的URL名称为"post_detail"
# 在模板中,您可以使用reverse来生成该视图的URL
url = reverse('post_detail', args=[post.id])
在上面的示例中,post_detail
是URL的名称,args
是一个列表,用于传递URL参数。在这个例子中,我们传递了一个名为post.id
的参数。
您还可以使用命名参数来传递参数。例如:
url = reverse('post_detail', kwargs={'post_id': post.id})
render
在这个例子中,我们使用kwargs
(关键字参数)来传递参数。参数名称是post_id
,对应的值是post.id
。
render函数的主要作用是结合模板和数据,向前端返回完整的渲染结果。
render函数的典型用法如下:
from django.shortcuts import render
def index(request):
context = {'name': 'John'}
return render(request, 'index.html', context)
这里render函数接受三个参数:
- request: 请求对象
- ‘index.html’: 渲染使用的模板
- context: 渲染模板使用的上下文数据
render会结合index.html模板和context上下文,渲染出完整的HTML页面,以HttpResponse对象形式返回。
redirect
在Django中,重定向(redirect)是一种将用户从一个URL自动重定向到另一个URL的技术。重定向通常用于在用户完成某个任务后将他们重定向到另一个页面,或者在用户提交表单后重定向到另一个页面。
在Django中,您可以使用redirect
函数来进行重定向。以下是一些示例:
- 重定向到另一个URL:
from django.shortcuts import redirect
def my_view(request):
# ...
return redirect('name')
在上面的示例中,当用户访问my_view
时,被重定向到名为another_view_name
的另一个视图。
- 重定向到另一个URL,并传递参数:
from django.shortcuts import redirect
def my_view(request):
# ...
param1 = 'value1'
param2 = 'value2'
return redirect('mane', param1, param2)
5. Django路由设置
Django使用urls.py文件来定义URL路由。
- urls.py文件:路由文件
project/urls.py是项目的总路由文件,每个app可以有自己的urls.py文件。 - path()函数:函数设置路由
# urls.py
from django.urls import path, include # 导入path和include
urlpatterns = [
# 定义带year整数参数的文章归档路径
path('articles/<int:year>/', views.year_archive, name='archive'),
# 包含books子路由,添加命名空间
path('books/', include('books.urls', namespace='books'))
]
# books/urls.py
from django.urls import path
urlpatterns = [
# 定义带book_title字符串参数的章节路径
path('<slug:title>/chapters/', views.chapters, name='chapters'),
]
注释点:
- path和include用于定义路由
- int:year等用于捕获路径参数
- name
- 给一个path()路径起一个别名。
- 用于通过这个别名反向生成URL。
- namespace
- 给一个include的路由集分配一个命名空间。
- 避免同名的name在不同的include中发生冲突。
- namespace隔离命名空间,避免反向解析冲突
- include包含子路由模块
6. Django模板
- 模板语言语法
Django模板语言使用{{ var }}表示变量,{% tag %}表示逻辑标签。模板通过这些语法实现独立的渲染逻辑。 - 模板标签:{% tag %}语法,用于流程控制、循环等逻辑。如{% if %}、{% for %}等。
- 模板过滤器:{{ var|filter }}语法,用于修改变量显示。如{{ name|lower }}转小写。
- 模板继承:base.html定义布局,子模板继承后填充 BLOCK。
- loader加载模板
可以使用loader.get_template()加载模板文件。 - render() : 在视图中使用render()渲染模板。
- Context: render()时需要传入context字典,提供模板渲染所需变量。
示例:
# view
from django.shortcuts import render # 从django.shortcuts导入render函数
def index(request):
# 使用loader加载名为index.html的模板文件
t = loader.get_template('index.html')
# 构造context字典,包含模板渲染所需的name变量
context = {'name': 'John'}
# 调用render函数渲染模板
# 需要传入request、模板文件名、context
return render(request, 'index.html', context)
<!-- index.html模板 -->
{% extends 'base.html' %} # 继承base.html模板
{% block title %}Home{% endblock %} # 填充title块
{% block content %} # 填充content块
<h1>Hello {{ name|upper }}!</h1> # 输出name变量,使用upper过滤器转换大写
{% endblock %} # 关闭content块
总结:
- render函数渲染模板
- loader可加载模板文件
- context字典提供渲染所需变量
- 模板使用extends、block实现继承
- 输出变量、使用过滤器修改输出
7. Django ORM数据库模型
以下是Django中常见的数据库模型数据类型:
字段名 | 数据类型 | 描述 |
---|---|---|
IntegerField | 整数类型 | 用于存储整数数据 |
PositiveIntegerField | 正整数类型 | 用于存储正整数数据 |
NegativeIntegerField | 负整数类型 | 用于存储负整数数据 |
AutoField | 自动增长整数类型 | 用于存储自增整数数据,常用于主键 |
BigIntegerField | 大整数类型 | 用于存储大整数数据 |
DecimalField | 小数类型 | 用于存储小数数据,可以指定小数点位数和精度 |
CharField | 字符串类型 | 用于存储字符串数据,可以指定最大长度 |
TextField | 长文本类型 | 用于存储大量文本数据 |
BooleanField | 布尔类型 | 用于存储布尔值数据,可以存储True或False值 |
NullBooleanField | 空值布尔类型 | 用于存储空值布尔值数据,可以存储True、False或空值 |
DateTimeField | 日期时间类型 | 用于存储日期时间数据,可以指定日期时间格式 |
DateField | 日期类型 | 用于存储日期数据,可以指定日期格式 |
TimeField | 时间类型 | 用于存储时间数据,可以指定时间格式 |
EmailField | 电子邮件类型 | 用于验证和存储电子邮件地址数据 |
GenericIPAddressField | 通用IP地址类型 | 用于存储IP地址数据,可以存储IPv4或IPv6地址 |
PositiveSmallIntegerField | 正小整数类型 | 用于存储正小整数数据 |
SmallIntegerField | 小整数类型 | 用于存储小整数数据 |
URLField | URL类型 | 用于验证和存储URL数据 |
SlugField | 缩略词类型 | 用于存储短字符串,常用于URL中 |
FileField | 文件类型 | 用于存储上传的文件数据 |
ImageField | 图像类型 | 用于存储上传的图像数据 |
Django数据库模型的一些常见属性和方法:
属性/方法 | 描述 |
---|---|
字段(Fields) | - 字段名(Field name):字段的唯一标识符,通常使用驼峰命名法。 |
- 数据类型(Data type):用于定义字段可以存储的数据类型,例如整数、字符串、日期等。 | |
- 参数(Parameters):用于进一步定义字段的行为或限制,例如最大长度、默认值等。 | |
- 主键(Primary key):如果该字段被指定为模型的主键,则会有一个主键约束。 | |
- 外键(Foreign key):如果该字段引用了另一个模型的主键,则会有一个外键约束。 | |
- 空值(Null):指定该字段是否允许存储空值。 | |
- 默认值(Default):为该字段指定默认值。 | |
方法(Methods) | - 构造函数(Constructor):用于创建模型的实例对象。 |
- 访问器(Accessor):用于访问模型实例的属性或字段。 | |
- 修改器(Mutator):用于修改模型实例的属性或字段的值。 | |
- 校验器(Validator):用于验证模型实例的属性或字段的值是否符合特定规则。 | |
- 清理器(Cleaner):用于在保存模型实例之前对数据进行清理和验证。 | |
关联(Associations) | - 一对一关联(One-to-one association):如果两个模型之间存在一对一关系,则可以使用一对一关联进行连接。 |
- 一对多关联(One-to-many association):如果一个模型与另一个模型之间存在一对多关系,则可以使用一对多关联进行连接。 | |
- 多对多关联(Many-to-many association):如果两个模型之间存在多对多关系,则可以使用多对多关联进行连接。 | |
管理方法(Manager methods) | - objects :用于获取模型的所有实例对象。 |
- create() :用于创建一个新的模型实例对象并返回该对象的实例。 | |
- get(id) :用于根据主键获取一个模型实例对象。 | |
- filter(条件) :用于根据条件过滤模型实例对象集合。 | |
- exclude(条件) :用于排除符合特定条件的模型实例对象集合。 | |
- order_by(字段) :用于对模型实例对象集合进行排序。 |
- 定义模型类
- 在Django中,模型类是用于定义数据库表的。模型类是定义在app的models.py文件中的类,它继承自Django的Model基类。
以下是一个简单的Django模型类的示例:
from django.db import models
class Blog(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
created = models.DateTimeField(auto_now_add=True)
这个模型类定义了一个名为Blog的数据库表,其中包含三个字段:title(标题)、description(描述)和created(创建时间)。字段类型分别是CharField、TextField和DateTimeField。
- 迁移生成表
Django是一个Python Web框架,它使用ORM(对象关系映射)来处理数据库操作。在Django中,数据库模型通常定义在一个名为models.py
的文件中,并通过python manage.py makemigrations
和python manage.py migrate
命令迁移到数据库中。 - 模型实例化和保存
在Django中,可以通过以下步骤来实例化并保存模型:
- 导入模型类:首先,需要导入需要使用的模型类。例如,如果有一个名为
Blog
的模型类,可以将其导入:
from myapp.models import Blog
- 实例化模型:接下来,可以通过创建模型类的实例来实例化模型。例如,可以使用以下代码创建一个
Blog
实例:
blog = Blog()
- 设置属性:可以通过赋值给实例的属性来设置模型的属性值。例如,可以使用以下代码为
Blog
实例的title
属性赋值:
blog.title = "My Blog"
- 保存模型:最后,可以使用
save()
方法将模型实例保存到数据库中。例如,可以使用以下代码保存blog
实例:
blog.save()
这将在数据库中创建一个新的记录,并将blog
实例的属性值保存到相应的数据库表中。
8.Django ORM数据库模型操作方法
-增加数据库数据
方法 | 描述 |
---|---|
save() | 创建一个实例,然后调用实例的save()方法将其保存到数据库。 |
create() | 直接创建并保存一个实例,无需先调用实例的save()方法。 |
bulk_create() | 批量创建多个实例,并将它们一次性保存到数据库。 |
在Django中,增加数据库数据的方法有以下几种: |
- 使用模型的
save()
方法:
from myapp.models import MyModel
# 创建一个实例
my_instance = MyModel(field1='value1', field2='value2')
# 保存到数据库
my_instance.save()
- 使用
create()
方法:
from myapp.models import MyModel
# 创建并保存一个实例
MyModel.objects.create(field1='value1', field2='value2')
- 使用
bulk_create()
方法(批量创建):
from myapp.models import MyModel
# 创建多个实例
instances = [MyModel(field1='value1', field2='value2'), MyModel(field1='value3', field2='value4')]
# 批量保存到数据库
MyModel.objects.bulk_create(instances)
-删除数据库数据
方法 | 描述 |
---|---|
delete() | 删除所有实例,调用模型的delete()方法即可。 |
filter() + delete() | 删除满足条件的所有实例,使用filter()方法过滤出需要删除的对象,然后调用delete()方法进行删除。 |
iterator() + delete() | 适用于大量数据的删除,先使用iterator()方法获取QuerySet中的所有对象,然后逐个调用delete()方法进行删除。 |
删除数据库数据的方法有以下几种:
- 使用模型的
delete()
方法:
from myapp.models import MyModel
# 删除所有实例
MyModel.objects.all().delete()
- 使用
filter()
方法结合delete()
方法:
from myapp.models import MyModel
# 删除满足条件的所有实例
MyModel.objects.filter(field_name='value').delete()
- 使用
delete()
方法配合QuerySet
的iterator()
方法(适用于大量数据):
from myapp.models import MyModel
# 删除所有实例
for obj in MyModel.objects.all().iterator():
obj.delete()
注意:可以和其他的查询方法+删除使用
- 修改数据库数据
方法 | 描述 |
---|---|
update() | 修改所有实例的字段值,调用模型的update()方法即可。 |
filter() + update() | 修改满足条件的所有实例的字段值,使用filter()方法过滤出需要修改的对象,然后调用update()方法进行修改。 |
iterator() + update() | 适用于大量数据的修改,先使用iterator()方法获取QuerySet中的所有对象,然后逐个修改字段值并调用save()方法进行保存。 |
在Django中,修改数据库数据的方法有以下几种: |
- 使用模型的
update()
方法:
from myapp.models import MyModel
# 修改所有实例的字段值
MyModel.objects.all().update(field_name='new_value')
- 使用
filter()
方法结合update()
方法:
from myapp.models import MyModel
# 修改满足条件的所有实例的字段值
MyModel.objects.filter(field_name='old_value').update(field_name='new_value')
- 使用
update()
方法配合QuerySet
的iterator()
方法(适用于大量数据):
from myapp.models import MyModel
# 修改所有实例的字段值
for obj in MyModel.objects.all().iterator():
obj.field_name = 'new_value'
obj.save()
注意:可以和其他的查询方法+修改使用
- 查询数据库数据
以下是Django查询API的一些常用方法及其用法:
方法名 | 用法 |
---|---|
all() | MyModel.objects.all() 返回包含所有对象的查询集(QuerySet) |
filter(**kwargs) | MyModel.objects.filter(name='John', age=30) 根据给定的条件过滤对象,可以传入多个关键字参数 |
exclude(**kwargs) | MyModel.objects.exclude(name='John', age=30) 排除满足给定条件的对象,与filter()方法类似,可以传入多个关键字参数 |
get(**kwargs) | MyModel.objects.get(name='John', age=30) 根据给定的条件获取单个对象,如果找不到匹配的对象,将引发DoesNotExist异常,可以传入多个关键字参数 |
first() | MyModel.objects.first() 返回查询集中的第一个对象,如果没有找到匹配的对象,将返回None |
last() | MyModel.objects.last() 返回查询集中的最后一个对象,如果没有找到匹配的对象,将返回None |
count() | MyModel.objects.count() 返回查询集中的对象数量 |
exists() | MyModel.objects.exists() 检查查询集中是否存在至少一个对象 |
values(**fields) | MyModel.objects.values('name', 'age') 返回一个包含字典的查询集,其中每个字典表示一个对象的属性值,可以传入一个或多个字段名作为关键字参数 |
values_list(**fields) | MyModel.objects.values_list('name', 'age') 返回一个包含元组的查询集,其中每个元组表示一个对象的属性值,可以传入一个或多个字段名作为关键字参数 |
代码太多了,不想写,自己看表
9.关于表单
推荐使用ModelForm,不要用forms.Form
Django ModelForm是Django中用于处理表单的类,基于模型,允许将表单与数据库中的模型关联起来。ModelForm提供了一些额外的功能,如自动生成表单字段、验证表单数据等。
以下是Django ModelForm的一些主要使用方法:
- 定义模型类:首先需要定义一个模型类,然后让ModelForm继承这个模型类。例如:
from django.db import models
from django.forms import ModelForm
class Person(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
class PersonForm(ModelForm):
class Meta:
model = Person
fields = ['name', 'age']
在这个例子中,我们定义了一个Person模型类和一个PersonForm表单类。PersonForm继承了Person模型类,并指定了表单中的字段。这样,我们就可以使用PersonForm来处理与Person模型相关的表单了。
- 渲染表单:在视图函数中,可以使用render()函数将表单渲染到HTML模板中。例如:
from django.shortcuts import render
from .forms import PersonForm
def show_person_form(request):
form = PersonForm()
return render(request, 'show_person_form.html', {'form': form})
在这个例子中,我们首先导入了PersonForm类,然后在视图函数show_person_form()中创建了一个PersonForm对象,并将其传递给render()函数以便渲染到show_person_form.html模板中。
- 处理表单提交:当用户通过表单提交数据时,可以在视图函数中处理这些数据。例如:
from django.shortcuts import redirect
from .forms import PersonForm
def add_person(request):
if request.method == 'POST':
form = PersonForm(request.POST)
if form.is_valid():
form.save()
return redirect('/') # 重定向到其他页面或返回HttpResponse对象
else:
form = PersonForm()
return render(request, 'add_person.html', {'form': form})
在这个例子中,我们首先检查请求方法是否为POST。如果是POST请求,则使用request.POST数据创建一个PersonForm对象,并检查其是否有效。如果表单有效,则调用save()方法将数据保存到数据库中,并重定向到其他页面或返回HttpResponse对象。如果请求方法不是POST,则创建一个空的PersonForm对象。
10.request.session 会话
在Django中,request.session
是一个字典对象,用于在用户会话之间存储和检索数据。它提供了一种跨多个请求和页面保持状态的方式。
使用request.session
,您可以在用户访问网站时存储和检索会话数据。这些数据可以在服务器上持久保存,并且在用户会话之间保持一致。
使用request.session
的示例:
- 存储数据:
# 在视图函数中
def my_view(request):
# 存储数据到会话中
request.session['key'] = 'value'
# 返回响应
return HttpResponse('Data stored in session.')
- 检索数据:
# 在另一个视图函数中
def another_view(request):
# 从会话中检索数据
value = request.session.get('key')
if value:
# 如果数据存在,则进行处理
print(value)
# 返回响应
return HttpResponse('Data retrieved from session.')
- 删除数据:
# 在视图函数中
def delete_view(request):
# 从会话中删除数据
del request.session['key']
# 返回响应
return HttpResponse('Data deleted from session.')