Django之流程梳理
一,设计模型
MVC模型:
优点,降低代码的耦合性
Model(模型):处理数据逻辑部分,通常是存储数据
Views(视图):展示数据部分,
Controller(控制器):应用程序中处理用户交互的部分
MTV模型:
Model(模型):负责业务对象和数据库的对象
Telmplate(模板):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
请求链路:
页面发起url请求-->根据url去匹配相应的视图函数-->视图去model里取数据(model去数据库中取数据)-->将数据返回的view视图-->把要展示的数据返回给Template-->再返回到HTML文件
Django的操作流程
1,首先创建一个项目
django-admin startproject 项目名
使用此命令可以查看创建的目录的结构(tree . /F)
│ manage.py(一个命令行工具,可以使我们有多种方式与Django进行交互)
│
└─project
               asgi.py
               settings.py(项目的配置文件)
               urls.py(项目的url声明,路由)
              wsgi.py
             __init__.py
基本操作:
1,设计表结构(首先需要数据库里面存数据,比如设置一个学生数据库表)
2,配置数据库
首先需要引入pyMySql
在__init__.py中写入两行代码:
import pymysql pymysql.install_as_MySQLdb()
在settings.py文件中的DATABASES中配置数据库:
DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "zcr", "USER": "root", "PASSWORD": "root", "HOST": "127.0.0.1", "PORT": "3306" } }
3,创建应用(在一个项目中可以创建多个应用,每个应用进行一个业务处理)
进入project项目下(和manage.py文件同级):执行下面的命令
python manage.py startapp myApp
│ admin.py(站点配置)
│  apps.py
│  models.py(模型文件)
│  tests.py
│  views.py(视图文件)
│  __init__.py
│
└─migrations
        __init__.py
4,激活应用
在settings文件中,将应用加入到INSTALLED_APPS中
5,定义模型(有一个数据表,就应对应一个模型里的一个class)比如下面的班级表和学生表
在model.py文件中定义模型:模型类要继承models.model(ps:不需要设置主键,会自动增加)
from django.db import models # Create your models here. # 类对应数据库中的一张表,表中的字段对应数据库中的属性 class Grades(models.Model): gname = models.CharField(max_length=20) gdate = models.TimeField() ggirlnum = models.IntegerField() gboynum = models.IntegerField() isDelete = models.BooleanField() class Students(models.Model): #设置为字符串类型 sname = models.CharField(max_length=20) #设置为布尔值 sgend = models.BooleanField(default=True) #设置为整数值 sage = models.IntegerField() scontend = models.CharField(max_length=100) isDelete = models.BooleanField(default=False) # 设置外键关联,如果不加on_delete的话,执行python manage.py makemigrations会报错
sgrade = models.ForeignKey(Grades,on_delete=models.CASCADE)
6,生成数据表(用代码生成数据表)
1,生成迁移文件:python manage.py makemigrations,执行后会在migrations目录下的迁移文件,此时数据库中还没有生成表
2,执行迁移:python manage.py migrate,执行后,在数据库中会生成对应的表,使用desc 表名,查看表结构
7,测试操作数据:
1,进入到测试环境:python manage.py shell(每次进入虚拟环境都要导包)
2,在该环境下引入包:比如在models里创建的类(因为要对他们进行操作):
from myApp.models import Grades,Students
from django.utils import timezone
from time import *
3,在该环境下执行sql语句:
查看表中的所有数据:<class name>.objects.all()
添加数据(本质是创建一个模型类的对象实例):如果要添加多条的话,再创建一个对象就可
grad1=Grades() grad1.gname = 'python04' grad1.gdate = datetime(year=2020, month=12, day=8) grad1.ggirlnum=10 #创建好之后,还需要保存 grad1.save()
4,查看某个对象:Grades.objects.get(pk=2)
5,修改数据:
先将对象的值重新赋值:列如(grad1.ggirlnum=30)然后再保存grad1.save()
6,删除数据:grad1.delete()物理删除(删了就删了)
7, 关联数据插入
#需要先将班级的信息赋值到对象中,然后将班级对象的值赋值给学生对象 >>> grad1=Grades.objects.get(pk=1) >>> stu.sname="薛艳梅" >>> stu.sgend=False >>> stu.sage=26 >>> stu.scontend="我叫薛艳梅,我长的很好看" >>> stu.sgrade=grad1 >>> stu.save()
8,查看所有关联表中的数据:
grad1.students_set.all():类名.关联类名的小写_ste.all()
9,直接插入关联表的数据(我直接创建一个学生,添加到python04这个班级中),这个不用save(),直接就添加到数据库中了
stu3 =grad1.students_set.create(sname=u'苏念秋',sgend=False,sage=25,scontend=u'我是六魁首之一的苏家家主')
8,启动服务器:
启动格式:python manage.py runserver ip:port(ip可以不写,默认是本机地址,端口号可以不写,默认是8000)
说明:这是一个python写的轻量级服务器,仅只是在开发中测试使用
9,admin站点管理
概述:
内容发布:负责添加,修改,删除内容
公告访问:
配置admin文件:
在settings.py配置文件中的INSTALLED_APPS添加"django.contrib.admin"
创建管理员用户:
执行命令:python manage.py createsuperuser
进入用户管理页面:在启动的服务器地址后面加上/admin即可(http://127.0.0.1:8000/admin/)
汉化:将settings.py文件中的参数修改为如下的即可
#设置为简体中文 LANGUAGE_CODE = 'zh-Hans' #设置时区 TIME_ZONE = 'Asia/Shanghai'
管理数据表:在admin.py文件中添加如下代码,将model中的数据库拿过来
from django.contrib import admin # Register your models here. from .models import Grades,Students #注册,配置完之后,在服务器启动页面,刷新一下,即可看到新增的两个数据表 admin.site.register(Grades) admin.site.register(Students)
自定义管理页面:比如页面字段的展示,过滤,搜索,分页,修改字段添加的顺序和给字段分组
1,先定义一个类,并且这个类继承于admin.ModelAdmin
2,定义好之后将类添加到上一步中的admin.site,register(Grades,GradesAdmin)
from django.contrib import admin # Register your models here. from .models import Grades, Students # 注册,配置完之后,在服务器启动页面,刷新一下,即可看到新增的两个数据表 class GradesAdmin(admin.ModelAdmin): # 列表页属性 #list_display显示model里数据表中的字段 list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete'] #list_filter,过滤器,可以根据设置的字段值来筛选数据 list_filter = ['ggirlnum'] #search_fields,搜索字段,根据字段进行搜索 search_fields = ['gname'] #页面数据展示,也设置的值为多少条每页 list_per_page = 1 # 添加,修改属性 # fields修改属性的先后顺序,管理页面默认有添加 #fields = ['gdate','isDelete','ggirlnum', 'gboynum','gname'] #fieldsets给属性分组 #注意,fields与 fieldsets不能同时使用 fieldsets = [ ("Num",{"fields":['ggirlnum','gboynum']}), ("Base",{"fields":['gdate','gname','isDelete']}), ] class StudentsAdmin(admin.ModelAdmin): list_display = ['pk', 'sname', 'sgend', 'scontend', 'isDelete', 'sgrade'] list_per_page = 1 admin.site.register(Grades, GradesAdmin) admin.site.register(Students, StudentsAdmin)
3,关联对象,需求:在班级表创建时,默认可以添加几个学生(如下代码所示)该继承于TabularInLine,还有StackedInline
#有一个需求:在关联的班级表创建的时候,同时新增几个学生 class StudentsInfo(admin.TabularInline): #模型继承于哪个类,即在创建班级的时候,默认创建几个学生(关联表) model = Students #默认创建的学生人数 extra = 2 #还需要在主表即被关联表中添加如下代码此表是Grades
#inlines = [StudentsInfo]
4,布尔值显示问题:在相应的数据表中,定义一个方法,判断该字段是否是ture,如果是则返回男,false则返回女
class StudentsAdmin(admin.ModelAdmin): #布尔值显示问题,判断该字段是否是ture,如果是则返回男,false则返回女 def gend(self): if self.sgend: return '男' else: return '女' def ISDelete(self): if self.isDelete: return '是' else: return '否' #然后在list_display里调用该方法即可 list_display = ['pk', 'sname', gend, 'scontend', ISDelete, 'sgrade'] list_per_page = 10
5,改表头的英文字段展示为中文:
def gend(self): if self.sgend: return '男' else: return '女' def ISDelete(self): if self.isDelete: return '是' else: return '否' gend.short_description = '性别'
6,页面执行动作的位置问题:
actions_on_top = False
actions_on_bottom = True
7,实际中使用的注册:
@admin.register(Students) # admin.site.register(Students, StudentsAdmin) class StudentsAdmin(admin.ModelAdmin): #布尔值显示问题,判断该字段是否是ture,如果是则返回男,false则返回女 def gend(self): if self.sgend: return '男' else: return '女' def ISDelete(self): if self.isDelete: return '是' else: return '否' gend.short_description = '性别' #然后在list_display里调用该方法即可 list_display = ['pk', 'sname', gend, 'scontend', ISDelete, 'sgrade'] list_per_page = 10
视图(views)的使用
1,概述:视图(views)就是一个python函数,在views.py文件中定义,
2,定义视图,如下所示,一个def就相当于是一个html页面,路径
from django.shortcuts import render from django.http.response import HttpResponse,JsonResponse # Create your views here. #方法都是需要一个request参数请求体 def index(request): #返回需要HttpResponse类 return HttpResponse("django is good man") def html1(request): return HttpResponse("{'admin':'zcr'}")
3,配置url:
首先,在应用中新建一个urls.py文件,并在其中进行配置,将views.py中的class和myApp.urls管理起来
#首先导入views视图文件 from . import views #导入django的path from django.urls import path urlpatterns = [ #新版本的django不推荐使用url了,都是用的path,如果要支持正则表达式的话需要用re_path #对应的是views中的index方法 path(r'index/',views.index), #对应的是views中的html1方法 path(r'html1/',views.html1) ]
然后,在项目的urls.py文件中将应用中的urls.py文件关联起来
from django.contrib import admin from django.urls import path,include,re_path urlpatterns = [ path('admin/', admin.site.urls), #将应用myApp中的urls文件和项目中的urls文件关联起来 path(r'',include('myApp.urls')), ]
模板的使用
概述:模板是Html页面,根据views.py文件传递过来的数据进行填充
模板的创建:和应用同级,在项目projenct下创建templates文件(directory)
配置模板路径:
修改settings.py文件下的Templates里的BASE_DIR(这个就是项目在电脑里的目录)如下图所示
BASE_DIR = Path(__file__).resolve().parent.parent #C:\Users\wb-zcr702260\PycharmProjects\untitled1\project print(BASE_DIR)
然后在Templates里面的dirs设置路径
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', #引入os类目,将templates路径添加到这里 'DIRS': [os.path.join(BASE_DIR,'templates')], 'APP_DIRS': True,
ps:模板下面可以对应多个应用的视图,比如在模板下新建一个myApp,那这个文件下的模板对应的都是myApp下的所有模板
创建模板(比如在templates/myApp目下创建grades.html模板和students.html模板)
模板语法:
{{输出值,可以是变量,也可以是对象.属性}}
{%执行代码段%}
从模板到可以显示html的流程比如这个路径显示(http://127.0.0.1:8000/grades/)
1,先创建好模板html文件,编写如何显示前端页面(比如创建的grades.html文件)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>班级信息</title> </head> <body> <h1>班级信息列表</h1> <ul> {%for grade in grades%} <li> <a href="#"> {{grade.gname}}} </a> </li> {%endfor%} </ul> </body> </html>
2,模板html文件编写好之后,需要去设置views.py视图文件,如下图所示(视图主要是获取数据给templates下的html文件)
#从模型中(数据库中)拿到数据
from .models import Grades,Students def grades(request): #从模型里面取出数据 gradesList=Grades.objects.all() #将数据传递给模板,模板再渲染页面,将渲染好的页面返回给浏览器 #其中render(请求参数request,模板的名称,传递的值(grades是模板里的执行代码)),其中模板的路径,只需要配置Html文件在templates下面的路径即可了 return render(request,'myApp/grades.html',{"grades":gradesList})
3,配置好url路径,如下图所示(将视图和url关联起来)
from django.urls import path, re_path urlpatterns = [ # 新版本的django不推荐使用url了,都是用的path,如果要支持正则表达式的话需要用re_path # 对应的是views中的index方法 re_path(r'index/', views.index), # 对应的是views中的html1方法 path(r'html1/', views.html1), path(r'detail/', views.detail), #配置views中的类的路径 path(r'grades/', views.grades) ]
需求:根据班级号,拿到班级下的所有学生信息:代码如下
<h1>班级信息列表</h1> <ul> {%for grade in grades%} <li> <a href="{{grade.id}}"> {{grade.gname}} </a> </li> {%endfor%} </ul>
2,编辑views视图文件
def studentGrade(request,num): gradeid=Grades.objects.get(pk=num) studentsList1=gradeid.students_set.all() return render(request,'myApp/students.html',{'students1':studentsList1})
3,配置urls路径
urlpatterns = [ # 新版本的django不推荐使用url了,都是用的path,如果要支持正则表达式的话需要用re_path # 对应的是views中的index方法 re_path(r'^grades/(\d)$',views.studentGrade) ]
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号