目录

1.Django简介

MTV模式

  • Model模型: 负责业务对象与数据库的对象
  • Template模板: 负责如何把页面展示给用户
  • View视图:负责业务逻辑,并在合适的时候调用Model和Template

注意:Django还有一个url分发器,它的作用是将一个个的URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

1.1. Django安装

  1. pip install Django
  2. import django
  3. print(django.get_version()) # 2.1.7

2. 创建一个基础的Django项目

2.1. 初始化项目

在你希望创建django项目的文件夹下输入

  1. django-admin startproject project

mysite项目下面有如下的文件

  1. project/
  2. manage.py # 管理 Django 项目的命令行工具,可以使用多种方式和Django项目进行交互
  3. project/ # 纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名(project.urls)
  4. __init__.py # 一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包
  5. settings.py # Django 项目的配置文件
  6. urls.py # Django 项目的 URL 声明,网站目录
  7. wsgi.py # 项目的运行在 WSGI 兼容的Web服务器上的入口

在mysite文件夹内运行

  1. python manage.py runserver # 启动了一个自带的简易服务器

2.2. 设计数据库

2.2.1. 设计目标表

本文中主要设计两个表:

  1. 班级表
ID 班级名称 成立时间 女生总数 男生总数 是否删除
1 gname gdate ggirlnum gboynum isDelete
  1. 学生表
ID 学生姓名 学生性别 学生年龄 学生简介 所属班级 是否删除
1 sname sgender sage scontend sgrade isDelete

2.2.1. 创建一个数据库

在mysql终端中创建一个dj_test的数据库

  1. create database dj_test;

2.2.2. 配置MySQL数据库

Django默认使用的SQLite数据库, 在settings.py中更改数据库配置为

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'dj_test',
  5. 'USER': 'root',
  6. 'PASSWORD': '***',
  7. 'HOST': 'localhost',
  8. 'PORT': '3306',
  9. }
  10. }

2.3. 创建应用

在一个项目中可以创建多个应用,每个应用进行一种业务逻辑,互不影响

project目录下,创建新的应用

  1. python manage.py startapp myApp

此时多了一个myApp的一个新的文件夹

  1. migrations/
  2. __init__.py
  3. admin.py # 站点配置
  4. apps.py
  5. models.py # 模型
  6. tests.py
  7. views.py # 视图

2.4. 激活应用

将应用配置到项目中,在settings.py中将myApp应用加入到INSTALLED_APPS

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'myApp'
  9. ]

2.5. 定义模型

  • models.py中进行定义模型,有一个数据表就对应有一个模型,本文中有两个数据表,需要两个模型
  • 用于和数据库交互
  • 模型类必须继承models.Model类,类的属性对应于表的字段
  • 主键自动添加
  1. from django.db import models
  2. # Create your models here.
  3. class Grades(models.Model):
  4. gname = models.CharField(max_length=20)
  5. gdate = models.DateField()
  6. ggirlnum = models.IntegerField()
  7. gboynum = models.IntegerField()
  8. isDelete = models.BooleanField()
  9. class Students(models.Model):
  10. # 1(班级)对多(学生),外键写在多的里面
  11. sname = models.CharField(max_length=20)
  12. sgender = models.BooleanField(default=True)
  13. sage = models.IntegerField()
  14. scontend = models.CharField(max_length=20)
  15. sgrade = models.ForeignKey('Grades', on_delete=models.CASCADE)
  16. isDelete = models.BooleanField(default=False)

2.6. 根据模型在数据库中生成表

第一步: 生成迁移文件

  1. python manage.py makemigrations
  • myApp/migrations下面生成的一个迁移文件,但是没有生成表

第二步: 执行迁移

  1. python manage.py migrate

生成以应用名_类名为表格名

在数据库中就生成了以下的表格

  1. +----------------------------+
  2. | Tables_in_dj_test |
  3. +----------------------------+
  4. | auth_group |
  5. | auth_group_permissions |
  6. | auth_permission |
  7. | auth_user |
  8. | auth_user_groups |
  9. | auth_user_user_permissions |
  10. | django_admin_log |
  11. | django_content_type |
  12. | django_migrations |
  13. | django_session |
  14. | myapp_grades |
  15. | myapp_students |
  16. +----------------------------+

注意:以后对于数据库的操作,是通过模型类的对象来完成,一个对象对应一条数据

2.7. 测试数据操作

进入到python shell环境

  1. python manage.py shell
  1. >>> from myApp.models import Grades, Students
  2. >>> from django.utils import timezone
  3. >>> from datetime impor *

查询所有数据

通过模型类的objects属性查询

类名.objects.all()

  1. >>> Grades.objects.all()

添加数据

本质: 创建一个模型类的对象实例

  1. grade1 = Grades()
  2. grade1.gname = 'python04'
  3. grade1.gdate = datetime(year=2017,month=7,day=17)
  4. grade1.ggirlnum = 3
  5. grade1.gboynum = 70
  6. grade2 = Grades()
  7. grade2.gname = 'python02'
  8. grade2.gdate = datetime(year=2017,month=7,day=20)
  9. grade2.ggirlnum = 5
  10. grade1.gboynum = 32
  11. grade1.save() # 存到数据库中
  12. grade2.save()

查看数据库select * from myapp_grades得到以下结果

  1. +----+----------+------------+----------+---------+----------+
  2. | id | gname | gdate | ggirlnum | gboynum | isDelete |
  3. +----+----------+------------+----------+---------+----------+
  4. | 1 | python01 | 2017-07-17 | 3 | 70 | 0 |
  5. | 2 | python02 | 2017-07-20 | 5 | 32 | 0 |
  6. +----+----------+------------+----------+---------+----------+

条件查询数据:

类目.objects.get(pk=index)

  1. g = Grades.objects.get(pk=2)

修改数据

修改grade2的姓名

  1. g = Grades.objects.get(pk=2)
  2. g.gname = 'python-666'
  3. g.save()

修改结果为:

  1. | 2 | python-666 | 2017-07-20 | 5 | 32 | 0 |

删除数据

  1. g.delete() # 物理删除

表关联

因为学生表和班级表有关系,我们可以在shell中测试

  1. stu = Students()
  2. stu.sname = 'zhangsan'
  3. stu.sgender = False
  4. stu.sage = 20
  5. stu.scontend = 'my name is zhangsan'
  6. stu.sgrade = grade2
  7. stu1 = Students()
  8. stu1.sname = 'lisi'
  9. stu1.sage = 20
  10. stu1.scontend = 'my name is lisi'
  11. stu1.sgrade = grade2
  12. stu1.save()
  13. stu.save()

此时students中有两条数据

  1. +----+----------+---------+------+---------------------+----------+-----------+
  2. | id | sname | sgender | sage | scontend | isDelete | sgrade_id |
  3. +----+----------+---------+------+---------------------+----------+-----------+
  4. | 1 | zhangsan | 0 | 20 | my name is zhangsan | 0 | 2 |
  5. | 2 | lisi | 1 | 20 | my name is lisi | 0 | 2 |
  6. +----+----------+---------+------+---------------------+----------+-----------+

2.7.1. 获取某个班级的所有学生

对象名.关联的类名小写_set.all()

  1. >>> grade2.students_set.all()
  2. >>> <QuerySet [<Students: Students object (1)>, <Students: Students object (2)>]>

2.7.2. 在班级中创建一个学生

不用save,直接添加到数据库中

  1. stu3 = grade2.students_set.create(sname='wangwu',sgender=True,scontend='my name is wangwu',sage=52)
  1. +----+----------+---------+------+---------------------+----------+-----------+
  2. | id | sname | sgender | sage | scontend | isDelete | sgrade_id |
  3. +----+----------+---------+------+---------------------+----------+-----------+
  4. | 1 | zhangsan | 0 | 20 | my name is zhangsan | 0 | 2 |
  5. | 2 | lisi | 1 | 20 | my name is lisi | 0 | 2 |
  6. | 3 | wangwu | 1 | 52 | my name is wangwu | 0 | 2 |
  7. +----+----------+---------+------+---------------------+----------+-----------+

2.8. 启动服务器

格式:

  1. python manage.py runserver ip:port

ip: 不写的话,代表本机IP
port: 默认8000

说明

django写的轻量级服务器,只在开发测试中使用

3. Django的admin站点管理

有一个可视化界面,用于添加、修改、删除内容

3.1. 配置admin应用

setting.py文件的INSTALLED_APP中添加django.contrib.admin(默认添加好了)

3.2. 创建管理员用户

  1. python manage.py createsuperuser
  2. C:\Users\haochen\Desktop\django\project>python manage.py createsuperuser
  3. Username (leave blank to use 'haochen'):
  4. Email address: 123@qq.com
  5. Password:
  6. Password (again):

启动管理界面

启动服务,进入到http://127.0.0.1:8000/admin

3.4. 管理数据表

修改admin.py

属性 类型 说明
list_display 列表页属性 显示字段
list_filter 过滤器来过滤字段
search_fields 搜索字段
list_per_page 分页
fields 添加修改页 规定属性先后顺序
fieldssets 给属性分组(和fields不能同时使用)
  1. from django.contrib import admin
  2. # Register your models here.
  3. from .models import Grades,Students
  4. # 注册
  5. # 自定义班级页面
  6. class StudentsInfo(admin.TabularInline):
  7. model = Students
  8. extra = 2
  9. class GradesAdmin(admin.ModelAdmin):
  10. # 在创建班级的时候,可以同时添加两个学生
  11. inlines = [StudentsInfo]
  12. # 列表页属性
  13. list_display = ['pk','gname','gdate','ggirlnum','gboynum','isDelete']
  14. list_filter = ['gname']
  15. search_fields = ['gname']
  16. list_per_page = 5
  17. # 添加,修改页属性
  18. # fields = []
  19. fieldsets = [
  20. ("Number Computations", {"fields": ['ggirlnum', 'gboynum']}),
  21. ("Base information", {"fields": ['gname', 'gdate', 'isDelete']})
  22. ]
  23. class StudentsAdmin(admin.ModelAdmin):
  24. # 修复布尔值显示问题
  25. def gender(self):
  26. if self.sgender:
  27. return "Male"
  28. else:
  29. return "Female"
  30. gender.short_description = "gender"
  31. list_display = ['pk','sname','sage',gender, 'scontend', 'sgrade', 'isDelete']
  32. list_per_page = 2
  33. admin.site.register(Grades,GradesAdmin)
  34. admin.site.register(Students,StudentsAdmin)

4. view的基本使用

  • 视图对web请求进行回应
  • 就是一个python函数,在views.py

4.1. 配置URL控制器

修改外部urls

修改mysite/mysite目录下的urls.py文件

  1. from django.contrib import admin
  2. from django.urls import path,include
  3. urlpatterns = [
  4. path('admin/', admin.site.urls),
  5. # 当页面中只输入主页面时,就会定位到myapp.urls中的url
  6. # 匹配真正的视图应该在myapp/urls中完成
  7. path('', include('myApp.urls'))
  8. ]

修改appurls

在mysite目录下创建urls.py

  1. from django.urls import path,include
  2. from . import views
  3. urlpatterns = [
  4. path(r'', views.index),
  5. path(r'<int:num>/', views.detail, name='num'),
  6. ]

4.2. 定义视图

views.py定义

  1. from django.http import HttpResponse
  2. def index(request):
  3. return HttpResponse("school is on time")
  4. def detail(request, num):
  5. return HttpResponse("details-%s"%(num))

5. 模板的基本使用

模板是HTML页面,可以根据视图传递过来的数据进行填充

需求: 输入http://127.0.0.1:8000/grades显示所有班级

5.1. 创建模板

创建templates+myApp文件夹,和manage.py同级,用于存放和myApp有关的模板

5.2. 配置模板路径

修改settings.py文件的TEMPLATES

  1. TEMPLATES = [
  2. {
  3. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  4. 'DIRS': [os.path.join(BASE_DIR, 'templates')],
  5. ...
  6. }
  7. ]

5.3. 创建HTML模板

  • 定义grades.htmlstudents.html
  • 模板语法
  1. {{输出值,可以是变量,也可以是对象.属性}}
  2. {%执行python代码段%}

5.3.1. 写grades模板

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>班级信息</title>
  6. </head>
  7. <body>
  8. <h1>班级信息列表</h1>
  9. <ul>
  10. <!--传过来的是对象[python04,python05,python06]-->
  11. {%for grade in grades%}
  12. <li>
  13. <a href="#">{{grade.gname}}</a>
  14. </li>
  15. {%endfor%}
  16. </ul>
  17. </body>
  18. </html>

5.4. 定义视图和配置URL

  • url
  1. urlpatterns = [
  2. path('', views.index),
  3. path('<int:num>/', views.detail, name='num'),
  4. path('grades/', views.grades, name = 'grades')
  5. ]
  • view
  1. from .models import Grades,Students
  2. def grades(request):
  3. # 去模板中取数据
  4. gradesList = Grades.objects.all()
  5. # 将数据传递给模板,模板再渲染页面,将渲染好的页面返回给浏览器
  6. return render(request, 'myApp/grades.html', {"grades": gradesList})

5.5. 测试

输入http://127.0.0.1:8000/grades,可以拿到以下数据

5.6. 实例: 定义student模板

  1. 定义view
  1. def students(request):
  2. studentList = Students.objects.all()
  3. return render(request, 'myApp/students.html', {"students": studentList})
  1. 定义url
  1. urlpatterns = [
  2. path('', views.index),
  3. path('<int:num>/', views.detail, name='num'),
  4. path('grades/', views.grades, name = 'grades'),
  5. path('students/', views.students, name = 'students')
  6. ]
  1. 定义模板
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>学生页面</title>
  6. </head>
  7. <body>
  8. <h1>学生信息列表</h1>
  9. <ul>
  10. <!--传过来的是对象[python04,python05,python06]-->
  11. {%for student in students%}
  12. <li>
  13. {{student.sname}}}--{{student.scontend}}
  14. </li>
  15. {%endfor%}
  16. </ul>
  17. </body>
  18. </html>

5.7. 查看每个班级下的学生

  1. 修改grades。html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>班级信息</title>
  6. </head>
  7. <body>
  8. <h1>班级信息列表</h1>
  9. <ul>
  10. <!--传过来的是对象[python04,python05,python06]-->
  11. {%for grade in grades%}
  12. <li>
  13. <a href="{{grade.id}}">{{grade.gname}}</a>
  14. </li>
  15. {%endfor%}
  16. </ul>
  17. </body>
  18. </html>
  1. 定义view
  1. def gradesStudents(request, number):
  2. # 获得对应的班级对象
  3. grades = Grades.objects.get(pk=number)
  4. # 获得班级下的所有学生列表
  5. studentsList = grades.students_set.all()
  6. return render(request, 'myapp/students.html', {"students": studentsList})
  1. 配置url
  1. urlpatterns = [
  2. path('', views.index),
  3. path('<int:num>/', views.detail, name='num'),
  4. path('grades/', views.grades, name = 'grades'),
  5. path('students/', views.students, name = 'students'),
  6. path('grades/<int:number>', views.gradesStudents, name = 'number')
  7. ]

6. 注意事项

6.1. 重新迁移问题

  • 删除迁移文件: myApp/migrations下除了__init__外全部删除

  • 删除数据库: 在mysql中删除数据库

Django教程01-全流程的更多相关文章

  1. 一条数据的HBase之旅,简明HBase入门教程-Write全流程

    如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...

  2. Java/JDK安装教程手册(正规图文全流程)、运行、环境配置

    Java/JDK教程手册 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Download Resouc ...

  3. Unity3D 发布APK安卓环境配置步骤、安装、教程(含Java/Android)(超全流程)

    Unity3D安卓环境配置运行 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  4. gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程

    什么是插件 Gitbook 插件是扩展 GitBook 功能(电子书和网站)的最佳方式. 只要是 Gitbook 默认没有提供的功能,基于插件机制都可以自行扩展,是插件让 Gitbook 变得更加强大 ...

  5. canvas 制作flappy bird(像素小鸟)全流程

    flappy bird制作全流程: 一.前言 像素小鸟这个简单的游戏于2014年在网络上爆红,游戏上线一段时间内appleStore上的下载量一度达到5000万次,风靡一时, 近年来移动web的普及为 ...

  6. python Django教程 之 安装、基本命令、视图与网站

    python  Django教程  之 安装.基本命令.视图与网站 一.简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 w ...

  7. Python.Django视频教程(全13集)

    Python.Django视频教程(全13集)教程目录: 下载地址:http://www.fu83.cn/thread-205-1-1.html

  8. 【Zigbee技术入门教程-01】Zigbee无线组网技术入门的学习路线

    [Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院  欧浩源 一.引言    在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感 ...

  9. 从Runoob的Django教程学到的

    Windows 10家庭中文版,Python 3.6.4,Django 2.0.3 这个月开始学习Django,从网上找到了RUNOOB.COM网站找到了一份Django教程,在“认真”学习之后,初步 ...

  10. Django运行方式及处理流程总结(转发)

    之前在网上看过一些介绍Django处理请求的流程和Django源码结构的文章,觉得了解一下这些内容对开发Django项目还是很有帮助的.所以,我按照自己的逻辑总结了一下Django项目的运行方式和对R ...

随机推荐

  1. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  2. Ansible安装及简单使用备注

    1.安装epel源: rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm 2.安装: yum ...

  3. c语言-自己写的库

    一.俗话说算法是程序的灵魂,这下面本人写了一部分常用算法,欢迎大家使用,并提出批评和指正,当然也可以改进或者添加. 1.这是自己实现的算法库头文件 #ifndef _INC_ALGORITHM #de ...

  4. 用ASP.NET Core 2.1 建立规范的 REST API -- 缓存和并发

    本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblogs.com/cgzl/p/9019314 ...

  5. The connection to the server localhost:8080 was refused - did you specify the right host or port?

    The connection to the server localhost:8080 was refused - did you specify the right host or port? 解决 ...

  6. 什么是Servlet(原理,从访问到方法)

    Servlet简介 Servlet是SUN公司提供的一门用于开发动态WEB资源的技术.SUN公司在其API中提供了一个Servlet接口,用户若想开发一个动态WEB资源(即开发一个Java程序向浏览器 ...

  7. Tomcat 对 HTTP 协议的实现(上)

    协议,直白的说就是存在一堆字节,按照协议指定的规则解析就能得出这堆字节的意义.HTTP 解析分为两个部分:解析请求头和请求体. 请求头解析的难点在于它没有固定长度的头部,也不像其他协议那样提供数据包长 ...

  8. IO 和 NIO 的思考

    输入输出是操作系统不可或缺的一部分,大致分为两类:面向磁盘和面向网络.在 Java 中有3种 I/O 类型:BIO.NIO 和 AIO,分别是同步阻塞.同步非阻塞和异步非阻塞 I/O,这里着重描述 B ...

  9. PostgreSQL相关整理

    PostgreSQL权限管理之创建可更新表的普通用户 https://my.oschina.net/aven92/blog/528943 PostgreSQL学习手册(角色和权限) http://ww ...

  10. Spring Cloud 系列之 Eureka 实现服务注册与发现

    如果你对 Spring Cloud 体系还不是很了解,可以先读一下 Spring Cloud 都有哪些模块 Eureka 是 Netflix 开源的服务注册发现组件,服务发现可以说是微服务架构的核心功 ...