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)
]

 

 

 

 

posted @ 2020-12-23 16:05  zhcr1  阅读(214)  评论(0)    收藏  举报