文章目录
1. Dijango简介
- Django 是一个开放源代码的 Web 应用框架,由 Python 写成
- 采用了 MVT 的软件设计模式,即模型(Model)+ 视图(View)+ 模板(Template)
- Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。
2. 安装
安装python及pycharm
安装Dijango:
pip install Dijango -i https://mirrors.aliyun.com/pypi/simple/
测试:python manage.py runserver
访问:http://127.0.0.1:8000/,到达Dijango页面表示成功
3. 创建
项目 VS 应用
应用是一个专门做某件事的网络应用程序——比如博客系统,或者公共记录的数据库,或者小型的投票程序。项目则是一个网站使用的配置和应用的集合。项目可以包含很多个应用。应用可以被很多个项目使用。
3.1 创建Dijango项目
项目名:djangoProject
python manage.py startproject 项目名
manage.py是项目管理文件,通过它管理项目。
然后就是与项目同名的目录,此处为djangoProject
- init.py是一个空文件,作用是这个目录test1可以被当作包使用。
- asgi.py是项目的asgi配置文件。
- settings.py是项目的整体配置文件。
- urls.py是项目的URL配置文件。
- wsgi.py是项目与WSGI兼容的Web服务器入口。
3.2 创建应用
创建: 程序名:zyApp
python manage.py startapp zyApp
编写视图函数: zyApp/views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
# 视图:对用户的请求进行业务逻辑操作,最终返回给用户一个响应
def index(request):
print("用户请求的路径:",request.path)
# 响应
return HttpResponse('<h1 style="color:green">图书馆里系统</h1>')
添加路由子文件: zyApp/urls.py
from django.urls import path
from zyApp import views
urlpatterns = [
# 当用户访问路径为book/,执行views.index视图函数
path(r'', views.index, name='index'),
]
修改路由主文件: djangoProject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 当用户访问路径为book/,访问zyApp/urls.py子路由配置文件
path('book/', include('zyApp.urls'))
]
启动服务器:
python manage.py runserver 9999
访问界面: 127.0.0.1:9999/book
4. 数据库模型
- 本实验使用Django默认数据库SQLite
4.1 创建
创建数据库模型:zyApp/models.py
from django.db import models
# 类对应数据库表,表名默认为zyApp_book
class Book(models.Model):
# 属性对应列名,默认会添加id这一列
name=models.CharField(max_length=40,verbose_name="书籍名称")
pub_date=models.DateField(verbose_name="出版日期")
# 字符串友好显示,便于调试代码
def __str__(self):
return self.name
# 在后台管理时显示自定义名称,否则会显示类名Book
class Meta:
verbose_name="图书管理" # 单数显示
verbose_name_plural=verbose_name # 复数显示
# 类对应数据库表,表名默认为zyApp_hero
class Hero(models.Model):
gender_choice=[(1,"男"),(2,"女")] # 性别包括
name = models.CharField(max_length=20,verbose_name="人物名称")
gender=models.IntegerField(choices=gender_choice,verbose_name="性别")
content=models.TextField(max_length=1000,verbose_name="人物描述")
book=models.ForeignKey(Book,on_delete=models.SET_NULL,null=True,verbose_name="书籍id")
def __str__(self):
return self.name
# 在后台管理时显示自定义名称,否则会显示类名Hero
class Meta:
verbose_name="人物管理" # 单数显示
verbose_name_plural=verbose_name # 复数显示
激活数据库模型: 生成数据库表,添加到主文件:djangoProject/settings
INSTALLED_APPS = [
#旧的不变,添加新的程序:
'zyApp',
]
应用数据模型:
1.生成迁移文件:根据模型类生成 sql 语句
python manage.py makemigrations
# 也可以在命令后面加上指定的app
# 生成的迁移文件可以在 zyApp/migrations 查看到
2.执行迁移:执行 sql 语句生成数据表
python manage.py migrate
刷新数据库:
4.2 数据库模型基本操作
操作准备:
1.进入交互式,并使用 Django 提供的免费 API
python manage.py shell
2.引入包:
from zyApp.models import Book,Hero
查看:
#查看全部
Book.objects.all()
Hero.objects.all()
# 根据条件搜索并查看
b1=Book.objects.filter(name="西游记")# 返回QuerySet
b1=Book.objects.filter(name="西游记").first()# 返回实例化对象
b1.pub_date
# 查询包含“红”
Book.objects.filter(name__contains="红")
# 查询不包含“红”
Book.objects.exclude(name__contains="红")
# 查询时间小于今天的
Book.objects.filter(pub_date__lt=date.today())
增加:
#字段包含时间,所以导入日期模块
from datetime import date
1.增加
b1=Book(name="红楼梦",pub_date=date(1969,1,1))
b2=Book(name="西游记",pub_date=date(1986,2,1))
2.保存(不保存,退出后没有变化)
b1.save()
b2.save()
修改
b1.name="XXX"
b1.save()
删除
b1=Book.objects.filter(name="西游记").first()
b1.delete()
添加关联对象:
1.创建书籍对象
b1=Book(name="倚天屠龙记",pub_date=date(1990,1,1))
b1.save()
2.创建人物对象并关联
h1=Hero(name="周芷若",gender=2,content="info......")
h1.book=b1
h1.save()
3.查看
h1.book
h1.book_id
b1.hero_set.all()
5. Django管理界面
5.1 启用admin后台站点管理
数据库迁移:
python manage.py makemigrations
python manage.py migrate
创建超户: admin
python manage.py createsuperuser
设置中文界面: 在 settings.py 中修改)
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
启动服务器: 设置端口为9999
python manage.py runserver 9999
访问: http://127.0.0.1:9999/admin
5.2 加入自定义模型
- Django 提供了 admin.ModelAdmin 类
- 通过定义 ModelAdmin 的子类,来定义模型在 Admin 界面的显示方式
编辑后台表单: zyApp/admin.py
from django.contrib import admin
from zyApp.models import Book,Hero
# 内联(Inline)显示:设置 Hero 可以在 Book 后台界面编辑
# 第二种:TabularInline替代StackedInline,表格形式显示
class HeroInline(admin.StackedInline):
model=Hero
extra = 2 # 默认提供 2 个足够的选项字段
# 书籍的自定义管理界面
class BookAdmin(admin.ModelAdmin):
list_display = ['id','name','pub_date'] # 包含要显示的字段名的元组
list_filter = ['pub_date'] #允许以 pub_date 字段来过滤列表
search_fields = ['name'] # 搜索框
list_display_links = ['name'] # 增加可以直接点击编辑的字段
list_per_page = 5 # 分页显示的每页显示个数
inlines = [HeroInline] # 设置 Hero 可以在 Book 后台界面编辑
# 人物的自定义管理界面
class HeroAdmin(admin.ModelAdmin):
list_display = ['id','name','gender']
list_filter = ['gender']
search_fields = ['name','content']
list_display_links = ['name']
list_per_page = 5
#增加和编辑页面设置
fieldsets = [('必填信息',{
'fields':['name','book_id']}),
('选填信息',{
'fields':['gender','content']}),
]
# 注册自定义后台表单
admin.site.register(Book,BookAdmin)
admin.site.register(Hero,HeroAdmin)
访问: 127.0.0.1:9999/admin/
6. 前台界面设置
- 快捷函数 render():载入模板,填充上下文,再返回由它生成的 HttpResponse 对象是一个非常常用的操作流程。
- templates目录 Django 将会在这个目录里查找模板文件。你项目的 TEMPLATES 配置项描述了 Django 如何载入和渲染模板。
创建html模板:
- templates/zyApp/index.html
- templates/zyApp/detail.html
编写视图: zyApp/views.py
from django.shortcuts import render
from django.http import HttpResponse
from zyApp.models import Book
# Create your views here.
# 视图:对用户的请求进行业务逻辑操作,最终返回给用户一个响应
def index(request):
books = Book.objects.all()
return render(request, 'zyApp/index.html', {
'books': books})
def detail(request, id):
book = Book.objects.filter(id=id).first()
heros = book.hero_set.all()
return render(request, 'zyApp/detail.html',
{
'book': book, 'heros': heros})
配置子路由: zyApp/urls
from django.urls import path
from zyApp import views
urlpatterns = [
# 当用户访问路径为book/,执行views.index视图函数
path(r'', views.index, name='index'),
# 显示书籍的详情页,接收int值赋给id
path(r'<int:id>/', views.detail, name='detail'),
]
前台界面:
# index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书管理系统/zyApp</title>
</head>
<body style="background-color: pink;margin: 0;">
<div style="padding: 10px 20px 10px;">
<h1 style="color:blue;font-family:KaiTi">图书管理系统</h1>
</div>
<!-- 核心代码start -->
<ol>
{% for book in books %}
<li><a href="/book/{
{ book.id }}/">{
{ book.name }}</a></li>
{% endfor %}
</ol>
<!-- 核心代码end -->
</body>
</html>
# detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书管理 | {
{ book.name }}</title>
</head>
<body style="background-color: pink">
<!-- 核心代码start -->
<h1>{
{ book.name }}</h1>
<h1>{
{ book.pub_date }}</h1>
<h1>{
{ heros }}</h1>
<!-- 核心代码end -->
</body>
</html>
效果: 访问 127.0.0.1:9999/book/ ,并点击查看书籍效果
7. Django生命周期
- 浏览器发出请求
- wsgi(request封装后交给Django框架)
- 读取路由配置文件—>获取urls.py
- views.py(视图函数)
- model.py—>获取DB,返回数据
- Template
- 返回数据到浏览器
Django 中间件:
- 修改请求,即传送到 view 中的 HttpRequest 对象。
- 修改响应,即 view 返回的 HttpResponse 对象。
process_request 方法: process_request 方法有一个参数 request,这个 request 和视图函数中的 request 是一样的。
process_request 方法的返回值:
- 返回值是 None 的话,按正常流程继续走,交给下一个中间件处理。
- 返回值是 HttpResponse 对象,Django 将不执行后续视图函数之前执行的方法以及视图函数,直接以该中间件为起点,倒序执行中间件,且执行的是视图函数之后执行的方法。
process_response
process_response 方法有两个参数,一个是 request,一个是 response,request 是请求对象,response 是视图函数返回的 HttpResponse 对象,该方法必须要有返回值,且必须是response。