Dijango简介、项目创建(数据库模型、后端站点管理、前端界面展示)、Django声明周期

1. Dijango简介


Django官方文档

  • Django 是一个开放源代码的 Web 应用框架,由 Python 写成
  • 采用了 MVT 的软件设计模式,即模型(Model)+ 视图(View)+ 模板(Template)
  • Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。

MVC与MVT

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数据库配置官方

  • 本实验使用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. 前台界面设置


Django前端界面官方

  • 快捷函数 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。

猜你喜欢

转载自blog.csdn.net/weixin_46069582/article/details/114210412