Django —— 快速开发、DRY原则
Django官方文档:Django文档
MVC框架
- MVC 的产生理念:分工。让专门的人去做专门的事。
- MVC核心思想:解耦。
- M:Model(模型), 和数据库进行交互
- V:View(视图),产生HTML页面
- C:Controller(控制器),接收请求,进行处理,与 M 和 V 进行交互,返回应答。
MVT(Django)
- M:Model(模型);和 MVC 中 M 功能相同,和数据库进行交互。
- V:View(视图);和 MVC 中的 C 功能相同,接收请求,进行处理,与 M 和 T 进行交互,返回应答。
- T:Template(模板);和 MVC 中的 V 功能相同,产生 HTML 页面。
项目创建
- 创建一个项目:命令 —— django-admin startproject 项目名
- 创建一个应用:命令 —— python manage.py startapp 应用名
- 目录结构及文件说明:
- 建立应用和项目之间的联系,需要对 应用进行注册。
- 修改settings.py 中的 INSTALLED_APPS配置项。
- 使用 python manage.py runserver 将服务器运行起来。
ORM
- ORM
- Object:对象——类
- Relations:关系数据库中的表
- Mapping:映射
- 图示:
- Django中内嵌了 ORM 框架,ORM框架可以将 类和数据表进行对应起来,只需要通过类核对象就可以对数据表进行操作。
- ORM另一个作用:根据设计的类生成数据库中的表。
1. 模型类
1)模型类设计:
# 图书类
# 图书类
class BookInfo(models.Model):
'''图书模型类'''
# 图书名称, CharField 说明是一个字符串, max_length 指定字符串最大长度
btitle = models.CharField(max_length=20)
# 出版日期,DateField说明是一个日期类型
bpub_date = models.DateField()
# 多类
# 英雄人物类
# 英雄名 hname
# 性别 hgender
# 年龄 hage
# 备注 hcomment
# 关系属性: 建立图书类和英雄人物类之间的一对多关系
class HeroInfo(models.Model):
'''英雄人物模型类'''
# 英雄名称
hname = models.CharField(max_length=20)
# 性别 BooleanField 说明是 bool 类型,default指定默认值 False 表示男
hgender = models.BooleanField(default=False)
# 备注
hcomment = models.CharField(max_length=200)
# 图书类和英雄人物类之间的一对多关系
hbook = models.ForeignKey('BookInfo', on_delete=models.DO_NOTHING)
注:需要继承 Django 中的 Model类 才是模型类。
- 生成迁移文件:
2)配置数据库连接
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_db',
'HOST': '',
'USER': 'root',
'PASSWORD': 'root',
'PORT': '3306'
}
}
3)模型类生成表
- 结果:
4)通过模型类操作数据表
- 使用
python manage.py shell
进入命令行
<1> 增
注意models.ForeignKey() 的赋值
数据库内容:
<2> 查
- 条件查询
- 查找所有
<3> 改
<4> 删
<5> 模型类命名规则
2. 后台管理
1) 本地化
- 语言 和 时区本地化。
- 修改 settings.py 文件。
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # 使用中文
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' # 中国时间
2)创建管理员
- 命令
python manage.py createsuperuser
3)注册模型类
- 在应用的 admin.py 中注册模型类。告诉Django框架根据注册的模板类来生成对应表的管理页面。
from django.contrib import admin
from app_01.models import BookInfo, HeroInfo
# 后台管理相关文件
# Register your models here.
# 注册模型类
admin.site.register(BookInfo)
- 管理员界面
- 可用通过重写 str 方法返回数据
class BookInfo(models.Model):
'''图书模型类'''
# 图书名称, CharField 说明是一个字符串, max_length 指定字符串最大长度
btitle = models.CharField(max_length=20)
# 出版日期,DateField说明是一个日期类型
bpub_date = models.DateField()
def __str__(self):
# 返回书名
return self.btitle
- 网页展示结果
4)自定义模型管理类
from django.contrib import admin
from app_01.models import BookInfo, HeroInfo
# 后台管理相关文件
# Register your models here.
# 自定义模型管理类
class BookInfoAdmin(admin.ModelAdmin):
'''图书模型管理类'''
list_display = ['id', 'btitle', 'bpub_date']
# 注册模型类
admin.site.register(BookInfo, BookInfoAdmin)
admin.site.register(HeroInfo)
- 网页展示结果
3. 视图
在 Django 中,通过浏览器请求一个页面时,使用 视图函数 来处理这个请求,视图函数处理之后,要给浏览器返回页面内容。
1)视图函数的使用
- 定义视图函数
视图函数定义在 views.py 中
例:from django.shortcuts import render from django.http import HttpResponse # Create your views here. # 1 定义视图函数 HttpRequest 对象 # 2 进行 url 配置,建立 url 地址和视图的对应关系 def index(request): # 进行处理,和 M 和 T 进行交互 ... return HttpResponse('返回结果')
- 进行 url 配置
应用 urls.py
项目 urls.pyfrom django.urls import path, re_path from app_01 import views urlpatterns = [ # 通过 url 函数 设置url路由配置项 re_path(r'^index', views.index), # 建立/index 和视图 index的关系 ]
from django.contrib import admin from django.urls import path, include,re_path # 项目的 urls 文件 urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^', include('app_01.urls')), # 包含 app_01 应用里面的 urls.py 文件 ]
2)url 匹配过程
4. 模板
模板不仅仅只是 HTML 文件
1)模板的使用
- 创建模板文件夹
- 配置模板目录
配置 settings.py 文件里面的 TEMPLATES'DIRS': [os.path.join(BASE_DIR, 'templates')], # 设置模板文件的目录
- 使用模板文件
- 加载模板文件
去模板目录下面获取html文件的内容,得到一个模板对象。 - 定义模板上下文
向模板文件传递数据。 - 模板渲染
得到一个标准的html内容。
- 加载模板文件
2)给模板文件传递数据
-
模板变量使用
{{ 模板变量名 }}
-
模板代码段:
{% 代码段 %}
-
V:
from django.shortcuts import render from django.http import HttpResponse from django.template import loader, RequestContext # Create your views here. # 1 定义视图函数 HttpRequest 对象 # 2 进行 url 配置,建立 url 地址和视图的对应关系 # 3 在应用的 urls 文件中进行 url 匹配的时: # 1 严格匹配开头和结尾 def index(request): # 进行处理,和 M 和 T 进行交互 ... # return HttpResponse('返回结果') # 使用模板文件 # 1 加载模板文件 # temp = loader.get_template('tests/demo.html') # 2 定义模板上下文:给模板传递数据 # context = RequestContext(request, {}) # 模板渲染:产生一个标准的 html 内容 # res_html = temp.render(context) # 返回给浏览器 tmp = render(request, 'tests/demo.html', context={'content': 'hello world', 'list': list(range(1, 10))}) return HttpResponse(tmp)
-
T:
<ul> {% for i in list %} <li>{{ i }}</li> {% endfor %} </ul>
-
结果: