一、Django框架简介

Django 是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计。由经验丰富的开发人员构建,它负责Web开发的许多麻烦,因此您可以专注于编写应用程序,而无需重新创建轮子。它是免费的和开源的。被官方称之为完美主义者的Web框架。
Django 官方文档:https://docs.djangoproject.com/zh-hans/3.1/

二、后台管理

1.项目创建与运行

1)创建项目

在这里插入图片描述

2)目录说明:

在这里插入图片描述

  • manage.py :一个命令行工具,可以使你用多种方式对 Django 项目进行交互
  • 内层的目录:项目的真正的Python包 init.py :一个空文件,它告诉Python这个目录应该被看做一个Python包
  • settings.py :项目的配置
  • urls.py :项目的URL声明
  • wsgi.py :项目与 WSGI 兼容的Web服务器入口

3)Terminal命令窗口执行:

python manage.py runserver

在这里插入图片描述

4)网页访问给定网址,如下图,说明Django创建成功

在这里插入图片描述

2.启用后台Admin 站点管理

  • 站点分为“内容发布(后台管理)”和“公共访问(前台管理)”两部分, “内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力的工作。因此, Django 会根据定义的模型类完全自动地生成管理模块。
  • Django 框架中有一个非常强大的应用功能: 自动管理界面。 常被Web平台管理者使用,去管理整个
    Web平台。

1)数据库迁移

#Terminal命令框中执行:
python manage.py makemigrations  #生成迁移文件
python manage.py migrate    #将数据库表写入数据库中

在这里插入图片描述创建完成后,如看不到DB下的文件,需要如下操作:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2)创建管理员用户

#Terminal命令框中执行:
python manage.py createsuperuser 

在这里插入图片描述
创建完超级用户后,网页访问127.0.0.1:8000/admin,输入上面创建的用户名、密码
进入管理站点,默认可以对 groups、users 进行管理

在这里插入图片描述在这里插入图片描述注意:python manage.py runserver需要一直在后台运行,才能访问127.0.0.1:8000/admin

3)本地化配置

#编辑setting文件,更改语言和时区
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

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

4)自定义模型加入后台管理

#编辑 bookApp/admin.py 文件,注册模型:
from django.contrib import admin
from models import Book
admin.site.register(Book)

在这里插入图片描述网页访问127.0.0.1:8000/admin
在这里插入图片描述

#编辑bookApp/modles.py 文件,汉化:
    class Meta:
        # 单数时显示的名称
        verbose_name="图书管理"
        # 复数时显示的名称
        verbose_name_plural=verbose_name

    class Meta:
        # 单数时显示的名称
        verbose_name="人物管理"
        # 复数时显示的名称
        verbose_name_plural=verbose_name

在这里插入图片描述

3.应用的创建和使用

1) 创建第一个应用程序

#Terminal命令框中执行:
python manage.py startapp bookApp#创建应用

应用结构:
在这里插入图片描述

2) 编写第一个视图函数

#打开文件 bookApp/views.py 并放入以下Python代码:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
# 视图: 对用户的请求(request)进行业务逻辑操作,最终返回给用户一个响应(response).

def index(request):
    print("用户请求的路径:",request.path)
    return HttpResponse

3) 路由规则

普通方式

#在 bookApp 目录中编辑urls.py文件
from bookApp.views import index

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',index),
]

在这里插入图片描述
访问网页http://127.0.0.1:8000/index/
在这里插入图片描述
子路由配置

##1.编辑BookManage\urls.py
from django.contrib import admin
from django.urls import path,include

from bookApp.views import index

urlpatterns = [
    path('admin/', admin.site.urls),
    # 当用户请求路径为/book/时,访问bookApp/urls.py子路由配置文件
    path('book/',include('bookApp.urls')),
]

##2在bookApp目录下新建文件urls.py
from django.urls import path
from bookApp import views

urlpatterns = (
    # 当用户访问路径是book/, 执行views.index视图函数。
    path(r'', views.index, name='index'),
)

##3#编辑bookApp\views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
# 视图: 对用户的请求(request)进行业务逻辑操作,最终返回给用户一个响应(response).
def index(request):
    print("用户请求的路径:",request.path)
    return HttpResponse('<h1 style="cloor:green">图书管理系统</h1>')

在这里插入图片描述

在这里插入图片描述
重新运行python manage.py runserver(更改文件不用重新运行,但增删文件需要),然后网页访问:http://127.0.0.1:8000/book/

在这里插入图片描述
访问流程:当用户访问http://127.0.0.1:8000/book/时,先由外部服务网关接口wsgi,接收用户的请求,接收后发现接收的路径是’book/’,然后在BookManage\urls.py中有定义path(‘book/’,include(‘bookApp.urls’)),即是路径’book/'时去读子urls:bookApp.urls,此时到bookApp目录下新建的文件urls.py中,发现’book/'后面没有跟内容,所以执行views.index函数,index函数的作用是:接收请求,打印请求的路径,返回响应图书管理系统

4.数据库模型

1)创建数据库模型

#编辑bookApp/models.py文件:
from django.db import models

"""
名词: 
    ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。
    这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法。
一对多关系:外键写在多的一端
book:hero = 1:n
"""
# Create your models here.

# 类对应数据库表, 表名称默认为bookApp_book.
#Book继承models.Model,会生成对应的数据库列表bookApp_book,数据库表有3列信息:id,title,date
class Book(models.Model):
    # 属性对应数据库表的列名,默认会添加id这一列。
    name = models.CharField(max_length=40, verbose_name="书籍名称")#CharField字符串,表里面对应的类名
    pub_date = models.DateField(verbose_name="出版日期")
    # 魔术方法,字符串友好展示, 便于调试代码
    def __str__(self):
        return  self.name

"""
更多查询操作请参考网址: https://docs.djangoproject.com/zh-hans/3.1/topics/db/queries/
"""
# 类对应数据库表, 表名称默认为bookApp_hero.
class Hero(models.Model):
    # 属性对应数据库表的列名,默认会添加id这一列。
    gender_choice = [
        (1, "男"),
        (2, "女")
    ]
    name = models.CharField(max_length=20, verbose_name="人物名称")
    # 性别只能选择男(1)或者女(2)
    gender = models.IntegerField(choices=gender_choice, verbose_name="性别")  # 1, 2
    content = models.TextField(max_length=1000, verbose_name="人物描述")
    # 外键关联, 如果删除书籍时,相关hero对应的书籍设置为空。
    book_id = models.ForeignKey(Book, on_delete=models.SET_NULL,
                                null=True, verbose_name="书籍id")
    def __str__(self):
        return  self.name

2)生成数据库表

#编辑 settings.py 文件,将应用加入到 INSTALLED_APPS 中:
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'bookApp',# 新添加的app
]

在这里插入图片描述

##Terminal命令框中执行:
python manage.py makemigrations %生成迁移文件
python manage.py migrate   %执行迁移,应用到数据库上

在这里插入图片描述生成迁移文件和数据库列表
在这里插入图片描述

在这里插入图片描述

3)数据库模型基本操作

##Terminal命令框中执行:
pip install ipython  #装完这个包可以在交互式环境下进行补齐操作
python manage.py shell #进入交互式的Python shell
from bookApp.models import Book,Hero  #导入需要的包
from datetime import date
Book.objects.all() #查看所有图书信息
b1 = Book(name="西游记", pub_date=date(2000,1,4)) #增加数据
b2 = Book(name="红楼梦", pub_date=date(1996,1,4)) #增加数据
b1.save() #保存图书信息,必须要保存,才能查看
b2.save()
Book.objects.all()
Out[15]: <QuerySet [<Book: 西游记>, <Book: 红楼梦>]>
b1.delete() #删除b1

增删改查操作:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4)创建关联对象

外键指向对象
在这里插入图片描述通过过滤器查看指定的对象:

在这里插入图片描述

5)自定义管理页面

#编辑bookApp/admin.py文件:
from django.contrib import admin
from bookApp.models import  Book,Hero
# 自定义后台站点管理的拓展阅读: https://docs.djangoproject.com/zh-hans/3.1/ref/contrib/admin/
# Register your models here.

class HeroInline(admin.StackedInline):
    model = Hero
    extra = 3

class BookAdmin(admin.ModelAdmin):
    # 图书列表页展示的设置
    list_display =  ['id', 'name', 'pub_date']  #展示
    list_filter = ['pub_date']  #过滤器
    search_fields = ['name']  #搜索框
    list_display_links = ['id','name']  #链接
    list_per_page =  5  #每页显示数量
    inlines =  [HeroInline]  #书的英雄关联,一本书里可以创建多个英雄

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)

网页访问:http://127.0.0.1:8000/admin/,效果如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、前台管理

1.URLconf 路由管理

  • 主URL访问子URL,子URL访问主页和详情页
#主URL,BookManage/urls.py:
from django.contrib import admin
from django.urls import path, include

from bookApp.views import index

urlpatterns = [
    path('admin/', admin.site.urls),
    # 当用户请求路径为/book/时,访问bookApp/urls.py子路由配置文件
    path('book/', include('bookApp.urls')),
]
#子URL,bookApp/urls.py:
from django.urls import path

from bookApp import views

urlpatterns = [
    # 当用户访问路径是book/, 执行views.index视图函数。
    path(r'', views.index, name='index'),
    # 显示书籍的详情页, 接收一个int值并赋值给id
    path(r'<int:id>/', views.detail, name='detail'),
]

2. 视图函数处理业务逻辑

#bookApp/views.py文件:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
# 视图: 对用户的请求(request)进行业务逻辑操作,最终返回给用户一个响应(response).

def index(request):
    print("用户请求的路径:",request.path)
    return HttpResponse('<h1 style="cloor:green">图书管理系统</h1>')

from bookApp.models import Book

def index(request):
    book=Book.objects.all()
    # return HttpResponse(books)
    return render(request,'book/index.html',{'books':books})

def detail(request,id):
    book=Book.objects.filter(id=id).first()
    heros=book.hero_set.all()
    return render(request,'book/detail.html',{'book':book,'heros':heros})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{ book.name }}</h1>
<h1>{{ book.pub_date }}</h1>
<h1>{{ heros }}</h1>
</body>
</html>

新建两个html文件:

在这里插入图片描述

在这里插入图片描述
网页访问效果:
在这里插入图片描述

在这里插入图片描述

3.模板管理实现好看的HTML页面

1)标题样式

在这里插入图片描述

在这里插入图片描述

2)列表

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

3)图片

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

4)链接

在这里插入图片描述

5)表格

在这里插入图片描述

6)表单

在这里插入图片描述

在这里插入图片描述

四、Django实现的生命周期

wsgi : 封装请求后交给后端的web框架( Flask、Django )。
请求中间件: 对请求进行校验或在请求对象中添加其他相关数据,例如: csrf、 request.session 。
路由匹配: 根据浏览器发送的不同 url 去匹配不同的视图函数。
视图函数: 在视图函数中进行业务逻辑的处理,可能涉及到: ORM、Templates 。
响应中间件: 对响应的数据进行处理。
wsgi : 将响应的内容发送给浏览器。

在这里插入图片描述