Django使用 Python语言写的开源Web开发框架 (open source web framework),它鼓励快速开发,并遵循MVC设计。Django遵照BSD版权,
html
初次发布于2005年,并在2008年发布了第一个正式版本1.0前端
M | 模型(Model),即数据存取层 | 处理与数据相关的全部事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。 |
V | 视图 (View),即业务逻辑层 | 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁 |
T | 模板 (Template)python 即表现层mysql |
处理与表现相关的决定,如何在页面或其余类型文档中进行显示 |
对象关系映射 (ORM object-relational mapping):以Python类形式定义你的数据模型,ORM将模型与关系数据库链接起来,你将获得一个很是容易使用的数据库API,同时你也能够在Django中使用原始的SQL语句。程序员
URL 分派:使用正则匹配URL,你能够设计任意的URL,没有框架的特定限定。像你喜欢的同样灵活。web
模版系统:使用Django强大而可扩展的模板语言,能够分隔设计、内容和Python代码。而且具备可继承性。正则表达式
表单处理:你能够方便的生成各类表单模型,实现表单的有效性检验。能够方便的从你定义的模型实例生成相应的表单。redis
Cache系统:能够挂在内存缓冲或其它的框架实现超级缓冲 -- 实现你所须要的粒度。sql
会话(session),用户登陆与权限检查,快速开发用户会话功能。shell
国际化:内置国际化系统,方便开发出多种语言的网站。
自动化的管理界面:不须要你花大量的工做来建立人员管理和更新内容。Django自带一个ADMIN site
Django官网 Django中文文档 Django基础教程 The Django Book Django-redis中文文档
django-admin startproject test1[test1为你要建立的项目名]
python manage.py startapp circle【circle是应用名】
O就是object-对象,R是relation-关系,M是mapping-映射。在ORM框架中,咱们经过类和数据表进行了一个映射,可让咱们经过类和类对象就能操做所对应的数据表中的数据。ORM的做用:根据设计的类生成数据库的表
使用Django进行数据库开发的步骤:
1.在models.py中定义模型类
2.迁移
3.经过类和对象完成数据的增、删、改、查操做
模型类定义在models.py文件中,继承自models.Model类
学生模型类已经定义完成了。接下来就须要第二个步骤生成迁移文件
在命令中输入 python manage.py makemigrations
打开迁移文件以下图:
接下来咱们须要执行迁移命令:
python manage.py migrate
当执行迁移命令后,Django框架会读取迁移文件自动帮咱们在数据库中生成对应的表格。
Django默认采用sqlite3数据库,上图中的db.sqlite3就是Django框架帮咱们自动生成的数据库文件。 sqlite3是一个很小的数据库,一般用在手机中,它跟mysql同样,咱们也能够经过sql语句来操做它。稍后我会将数据展现到页面给你们看一下数据的状况,或者能够下载sqlite3数据库有关的软件查看
完善下面咱们从新复习一下上面的步骤删除所建的项目重头仍是作一次而后再完善下学生和学校这两个类供咱们以后的学习使用
1 class ClassInfo(models.Model): 2 """班级信息模型类""" 3 class_name = models.CharField(max_length=20) 4 class_num = models.IntegerField() 5 6 7 class StudentInfo(models.Model): 8 """学生信息模型类""" 9 name = models.CharField(max_length=20) 10 age = models.IntegerField() 11 gender = models.BooleanField(default=False) 12 stu_class = models.ForeignKey(ClassInfo,on_delete=models.CASCADE)
ForeignKey(ClassInfo,on_delete=models.CASCADE)
这里咱们能够经过shell模式进行简单的添加一些数据
进入shell 在命令行中输入:python manage.py shell
1 # 首先引入test1.models下的类 2 from test1.models import ClassInfo, StudentInfo 3 """ 4 这里提醒一下test1为你的应用名不是项目名称 5 若是在导包的时候发现报错,首先查看一下导入的包名或者类名 6 是否正确。若是都正确,就是有肯能就是你在进入shell以后才编 7 写的类,这时候退出shell模式,在重新进入一次就能够了 8 """
接下来查询一下ClassInfo、StudentInfo中的信息看看会如何显示
ClassInfo.objects.all() # 目标结果会返回一个<QuerySet []>由于这里尚未写入任何数据
接下来就是经过Python 的shell中插入一条数据
1 c = ClassInfo() # 建立一个ClassInfo对象 2 c.class_name = '高三·三班' # 设置名字 3 c.class_num = 66 # 设置班级人数 4 c.save() # 调用save()方法 5 # 在查询一下ClassInfo里的数据 6 ClassInfo.objects.all() # 目标结果为<QuerySet [<ClassInfo: ClassInfo object (1)>]>
数据已经插入了,接下来查询一下id=1的对象数据
1 c = ClassInfo.objects.get(id=1) 2 c # <ClassInfo: ClassInfo object (1)> 3 c.id # 1 4 c.class_name # 高二·三班 5 c.class_num # 66 6 # 咱们也能够经过c这个对象修改这条数据里面的信息 7 c.class_num = 54 8 c.save() 9 c.class_num # 这里就会返回修改后的数据54
建立一个关联ClassInfo的StudentInfo的数据
# 建立一个StudentInfo类的对象 s = StudentInfo() s.name = '李雷' s.age = 16 s.stu_class = c s.save() # 班级与学生是一对多的关系,django中提供了关联的操做方式 # 得到关联集合:返回当前班级对象的全部学生 c.studentinfo_set.all() # <QuerySet [<StudentInfo: StudentInfo object (1)>]>
如今这种状况下想查看一下数据,真的是很不方便,若是在没有相关数据库软件的时候,就只能在Shell中查看吗?这里Django还提供了一个后台管理之类的东西,咱们将数据显示在哪里试一下
打开untitled/settings.py文件,找到语言编码、时区的设置项,将内容改成以下:
LANGUAGE_CODE = 'zh-hans' # 设置中文 TIME_ZONE = 'Asia/Shanghai' # 设置时区
# 建立命令 python manage.py createsuperuser # 接下来就是设置用户名、邮箱、密码 # 启动服务器 python manage.py runserver # 而后能够打开浏览器查看是否成功 # 127.0.0.1:8000/admin/
打开test1/admin.py文件
1 from django.contrib import admin 2 from test1.models import ClassInfo, StudentInfo 3 4 5 # Register your models here. 6 admin.site.register(ClassInfo) 7 admin.site.register(StudentInfo)
在浏览器刷新页面就能够看见本身test1这个应用被添加进来
打开test1/admin.py文件
from django.contrib import admin from test1.models import ClassInfo, StudentInfo # 自定义类 class ClassInfoAdmin(admin.ModelAdmin): list_display = ['id', 'class_name', 'class_num'] class StudentInfoAdmin(admin.ModelAdmin): list_display = ['id', 'name', 'age', 'gender', 'stu_class'] # Register your models here. admin.site.register(ClassInfo, ClassInfoAdmin) admin.site.register(StudentInfo, StudentInfoAdmin)
刷新页面,数据就会显示出来了
Django给我提供的管理页面,咱们没有写,若是配置页面的规则,可是浏览器就能找到,这是由于Django默认给咱们陪着了这个页面的信息,那么接下来咱们就来了解一下定义视图,配置URLconf,对于Django的设计框架MVT,用户在URL中请求的视图,视图接受请求后进行处理,并将处理的结果返回给请求者
使用视图时须要进行两部操做:
1.定义视图函数
2,配置URLconf
打开test1/views.py,定义视图:
from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse('测试')
完成URLconf配置
# untitled项目中的urls.py from django.contrib import admin from django.urls import path from django.conf.urls import include, url urlpatterns = [ path( 'admin/', admin.site.urls ), url( r'^', include( 'test1.urls' ) ) ]
# test1应用中urls.py from django.conf.urls import url from test1 import views urlpatterns = [ url(r'^index$', views.index), ]
接下来就在浏览器中测试一下
在Django中将前端的内容定义在模板中,而后再把模板交给视图调用。就能够完成以上的操做。
那么问题来了,每一个模块都有本身的归属,模板的归属在哪里,若是你是用Pycharm生成的项目,你就会发现有一个空文件夹一直未使用,他的名字就叫 templates
这里我会在templates里建立一个和应用名同样的文件夹,来存储这个应用所使用的页面,那么就让咱们动手来建立吧
这样就算完成了吗?并无,如今你就须要让去配制一下它的路径,让咱们的程序要到它
首先打开test4/settings.py文件,设置TEMPLATES的DIRS值
DIRS': [os.path.join(BASE_DIR, 'templates')],
在你刚刚建立的index.html开始书写你的网页
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>index模板</title> 6 </head> 7 <body> 8 <h1>{{ class_name }}</h1> 9 <ul> 10 {% for class_name in class_list %} 11 <li>{{ class_name }}</li> 12 {% endfor %} 13 </ul> 14 </body> 15 </html>
这里必定会发现一堆乱七八糟的东西,出如今你的视线里。
<!--在模板中输出变量,变量多是从视图中传递过来的,也多是在模板中定义的--> {{变量名}} <!--下面就是模板使用代码段的方式--> {%代码段%}
既然视图中能够传值过来,那么怎么传?暂时先不告诉你明白下面的内容,你天然就会懂得
调用模板的三个步骤:
这里就来找到视图views.py这个文件调用上面定义的模板文件
from django.http import HttpResponse from django.template import loader # /index def index(request): # 1.获取模板 template = loader.get_template('class_system/index.html') # 2.定义上下文 context = {'class_name': '二年三班', 'class_list': ['二年一班', '二年二班']} # 3.渲染模板 return HttpResponse(template.render(context))
刷新你的浏览器,会给你一个惊喜
那么每次都须要写的那么烦吗?你学的但是Python,那么固然并不用
视图调用模板要执行以上三部分,因而Django提供了一个函数render封装了以上代码,方法render包含3个参数
1 """ 2 from django.http import HttpResponse 3 from django.template import loader 4 5 6 # /index 7 def index(request): 8 # 1.获取模板 9 template = loader.get_template('class_system/index.html') 10 # 2.定义上下文 11 context = {'class_name': '班级', 'class_list': ['二年一班', '二年二班', '二年三班']} 12 # 3.渲染模板 13 return HttpResponse(template.render(context)) 14 """ 15 from django.shortcuts import render 16 17 18 def index(request): 19 context = {'class_name': '惊喜班级', 'class_list': ['二年一班', '二年二班', '二年三班']} 20 return render(request, 'class_system/index.html', context)
刷新页面有惊喜
下面经过数据库咱们来巩固一下上面啰嗦的一堆
在开始写代码以前,考虑一下我都须要什么
修改views.py
""" from django.http import HttpResponse from django.template import loader # /index def index(request): # 1.获取模板 template = loader.get_template('class_system/index.html') # 2.定义上下文 context = {'class_name': '班级', 'class_list': ['二年一班', '二年二班', '二年三班']} # 3.渲染模板 return HttpResponse(template.render(context)) """ from django.shortcuts import render from class_system.models import ClassInfo def index(request): """显示班级""" class_list = ClassInfo.objects.all() context = {'class_name': '咱们的青春', 'class_list': class_list} return render(request, 'class_system/index.html', context) def detail(request, cid): """显示学生详情""" c = ClassInfo.objects.get(id=cid) student_list = c.studentinfo_set.all() return render(request, 'class_system/detail.html', {'c': c, 'student_list': student_list})
定义URLconf
from django.conf.urls import url from class_system import views urlpatterns = [ url(r'index$', views.index), # \d+ 表示多个数字 也就是匹配index页面<a href="/{{ c.id }}">返回的页面地址 # ()用于分组,将值传递给views里detail中的cid接收 url(r'(\d+)$', views.detail), ]
修改templates/class_system/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index模板</title> </head> <body> <h1>{{ class_name }}</h1> <ul> {% for c in class_list %} <li><a href="/{{ c.id }}">{{ c.class_name}}</a></li> {% endfor %} </ul> </body> </html>
添加一个templates/class_system/detail.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>{{ c.class_name }}</h1> <ul> {% for student in student_list %} <li> {{ student.name }}:{{ student.age }}:{% if not student.gender == False %}女{% else %}男 {% endif %} </li> {% endfor %} </ul> </body> </html>