一、Django简介
Django是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!
初次发布于2005年7月,并于2008年发布了第一个正式版本1.0。
二、Django特点
强大的数据库功能: 拥有强大的数据库操作接口(QuerySet API),如需要也能执行原生SQL。
自带强大的后台: 几行简单的代码就让你的网站拥有一个强大的后台,轻松管理内容!
优雅的网址: 用正则匹配网址,传递到对应函数,随意定义,如你所想!
模板系统: 强大,易扩展的模板系统,设计简易,代码,样式分开设计,更容易管理。
(注:前后端分离时,也可以用Django开发API,完全不用模板系统。)
缓存系统,与Memcached, Redis等缓存系统联用,更出色的表现,更快的加载速度。
国际化,完全支持多语言应用,允许你定义翻译的字符,轻松翻译成不同国家的语言。
三、MVC模式
MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件中,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC
- Model(模型)
应用程序中用于处理应用程序数据逻辑部分;
通常模型对象负责在数据库中存取数据;
- View(视图)
应用程序中处理数据显示部分;
通常视图是依据模型数据创建的;
- Controller(控制器)
应用程序中处理用户交互部分;
通常控制器负责从视图中读取数据,控制用户输入,并向模型发送数据;
优点: 降低各个功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用。
四、MTV模式
本质上MTV与MVC模式没有什么区别,也是各组件之间为了保持松耦合关系,只是定义上有些不同。
MTV
- View(视图)
负责业务逻辑,并在适当的时候调用Model和Template
Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template。
五、Django环境搭建
Django版本选择
pip安装(如果有直接跳过)
- 下载get-pip.py文件(Linux, Mac OSX, Windows都可用)https://bootstrap.pypa.io/get-pip.py- 安装(在终端中运行) $ python get-pip.py备注: 当Python2.x和Python3.x共存的时候要区分是哪个版本需要安装;
pip更新(Linux或MacOS): pip install -U pip
pip更新(Windows): python -m pip install -U pip
安装Django
- 安装 $ pip install Django==1.11.4- 验证是否成功()
进入到python环境(终端中输入python)
>>> import django
>>> django.get_version()'1.11.4'
六、Django项目创建
新建Django项目:
$ django-admin startproject projectName目录层级说明:
manage.py 一个命令行工具,可以使我们多种方式对Django项目进行交互 projectName/__init__.py 一个空文件,告诉python这个目录被看做一个python包(有这个能称之为包)
projectName/settings.py 项目的配置文件
projectName/urls.py 项目URL声明
projectName/wsgi.py 项目与WSGI兼容的Web服务器入口
备注: Linux或Mac下,直接在终端中操作;而在Windows中在cmd中操作(开始 -> 搜索cmd)
七、设计表结构
班级表
表名: grades字段: 序号id、班级名gname、开班时间gdate、男生数量gboynum、女生数量ggirlnum、是否删除isdel
学生表
表名: students字段: 序号id、学生名sname、性别ssex、年龄sage、班级sclass、简介sbrief、是否删除isdel
八、配置数据库
在__init__中添加两行代码 (确保安装mysql,另外需要pip3 install pymysql)
importpymysqlpymysql.install_as_MySQLdb()
python3安装的是PxMysql (和python2是不一样的)
在settings.py中修改默认数据库
DATABASES = {'default': {
# 修改为
mysql'ENGINE':'django.db.backends.mysql',
# 必须先创建有对应的数据库
'NAME':'zyz',
# 用户名
'USER':'root',
# 密码
'PASSWORD':'123456’,
# 主机
'HOST': '127.0.0.1',
# 端口号
'POST': '3306’ }}
Django默认使用SQLine数据库
九、创建应用
要先进入项目目录下,cd projectName然后执行下面的命令:
$ python3 manage.py startapp appName
项目文件说明:
admin.py 站点配置
models.py 模型
views.py 视图
其实一个项目中可以创建多个应用;
十、激活应用
在settings.py文件中,将appName应用加入到INSTALL_APPS选项中.
INSTALLED_APPS = ['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'appName'# 添加自己的应用]
十一、定义模型
班级表
# 班级表
GradesclassGrades(models.Model)
:# 对应字段,以及字段类型
# id = models.IntegerField()
gname = models.CharField(max_length=30)
gdate = models.DateField()
gboynum = models.IntegerField()
ggirlnum = models.IntegerField()
isdel = models.BooleanField(default=False)
需要引入from django.db import models。模型类要继承models.Model类。
学生表
# 学生表
StudentsclassStudents(models.Model):
# 自定义模型管理器
studentObj1 = models.Manager()
studentObj2 = StudentsManager()
# 在没有添加主键时,它会在生成时自动添加主键
# id = models.IntegerField()
sname = models.CharField(max_length=30)
ssex = models.CharField(max_length=10)
sage = models.IntegerField()
sbrief = models.CharField(max_length=50)
isdel = models.BooleanField(default=False)
# 关联外键(学生都会有一个班级)
sclass = models.ForeignKey('Grades')
十二、数据库中生成对应表单
生成迁移文件
$ python3 manage.py makemigrations
备注: 在migrations目录中生成一个迁移文件,此时数据库中还没生成表单
执行迁移
$ python3 manage.py migrate
备注: 相当于执行了MySQL语句创建了表单(appname_students、appname_grades)
十三、测试数据库表单操作
- 进入到Python shell
$ python3 manage.py shell
- 引入包
from myapp.models import Grades,Students
from django.utils import timezone
from datetime import *
- 查询所有数据
Grades.objects.all()
备注: 在模型类中,其实会有一个隐藏属性objects-
添加数据(创建对象)
>>> grade = Grades()
>>> grade.gname ='python04'
>>> grade.gdate = datetime(year=2018,month=5,day=27)
>>> grade.gboynum =30>>> grade.ggirlnum =20
>>> grade.save()
# 只有执行保存,才会往数据库中插入数据备注: 添加数据本质,就是创建一个模型类的对象实例- 查看数据(查看对象)
Grades.objects.get(pk=1)
Grades.objects.get(pk=2)
- 修改数据(修改对象属性)
g = Grades.objects.get(pk=1)
g.gboynum =70g.save()
- 删除数据
g.delete()
# 物理删除,即数据库中表单数据被删除
- 关联对象
# 获取到班级对象 (pk即是id那个字段)
>>> grade = Grades.objects.get(pk=2)
# 添加学生对象
>>> stu1 = Students()
>>> stu1.sname ='王大帅'
>>> stu1.ssex ='男'
>>> stu1.sage =18
>>> stu1.sbrief ='我住隔壁,我姓王,你有事情我帮忙'
>>> stu1.sclass = grade
# 这个即是关联上对象,如果没有管理,执行save会报错
>>> stu.save()
>>> stu2 = Students()
>>> stu2.sname ='李花花'
>>> stu2.ssex ='女'
>>> stu2.sage =18
>>> stu2.sbrief ='你负责赚钱养家,我负责貌美如花.'
>>> stu2.sclass = grade
>>> stu2.save()
- 获取关联对象 语法: 对象.关联的类名小写_set.all()
例如: grade.students_set.all()
备注: 在班级中,想要获取某个班级中关联的学生信息 需求: python04班级存在, 如何快速关联上快速创建对应学生?
# 可以直接通过以下方法创建,并且不需要调用保存 (但班级是python04而不是python05)
# 其实就是直接grade和创建的学生对象关联起来了
stu3 = grade.students_set.create(sname='王八',ssex='男',sage=20,sbrief='哈哈,咬我啊..')
十四、启动服务器
语法:python3manage.pyrunserverip:port
例如:python3manage.pyrunserver
备注:IP可以不写,代表即是本机IP端口号默认是8000
启动成功后,在浏览器可以看到”Itworked!”
说明: 这是一个纯python写的轻量级web服务器,仅仅在开发测试阶段中使用
十五、Admin站点管理(后台可视化界面操作)
概述
内容发布: 负责添加、修改、删除内容
公告访问
配置Admin应用
在`settings.py`文件中的IINSTALLED_APPS中添加'django.contrib.admin'(默认是已经是添加好的)
创建管理员用户
$ python3 manage.py createsuperuser
访问站点管理
语法: ip:端口号/admin
例如: 192.168.0.13:8000/admin
站点管理的汉化版
在settings.py中替换以下内容即可 LANGUAGE_CODE ='en-us'替换 LANGUAGE_CODE ='zh-Hans'TIME_ZONE ='UTC'替换 TIME_ZONE ='Asia/Shanghai'
管理数据表(后台界面中)
修改admin.py文件:
# 引入
from.modelsimportGrades,Students
# 注册
admin.site.register(Grades)admin.site.register(Students)
自定义管理数据页面(因为原本页面显示不够友好)
# 自定义管理数据页面
# 该类需要注册时添加进去
classGradesAmin(admin.ModelAdmin):
# 列表页的属性
# 显示字段(需要显示什么字段,就写上什么字段即可)
list_display = ['pk','gname','gdate','gboynum','ggirlnum','isdel']
# 过滤器(过滤字段)
list_filter = ['gname']
# 搜索字段
search_fields = ['pk']# 分页(多少条为一页)list_per_page =5
# 添加、修改页属性# 属性的先后顺序
fields = ['gboynum','gname','gdate','ggirlnum','isdel']
# 给属性分组(fields和fieldsets不能同时使用)
fieldsets = [
('num',{'fields':['gboynum','ggirlnum']}),
('base',{'fields':['gname','gdate','isdel']}),
]
# 注册(以后其实不会在这里完成注册,会通过装饰器完成注册!)
admin.site.register(Grades,GradesAmin)
自定义管理页面(关联对象)
需求: 在创建班级时,可以直接添加几个学生
# TabularInline 或 StackedInline 两种显示方式
classStudentsInfo(admin.TabularInline):
# 要创建学生
model = Students
# 需要创建几个
extra =1
# 与Grades关联上
classGradesAmin(admin.ModelAdmin):
# 与上面关联上inlines = [StudentsInfo]
自定义管理页面(布尔类型的显示问题)
classStudentsAdmin(admin.ModelAdmin):
defisdel(self):ifself.isdel ==False:return"删除"
# 设置页面列的名称
isdel.short_description ='是否删除'
自定义管理页面(执行动作的位置)
# 将动作位置放置底部
classStudentsAdmin(admin.ModelAdmin):
# 执行动作的位置
actions_on_bottom =Trueactions_on_top =False
十六、使用装饰器完成注册
# 自定义管理数据页面@admin.register(Students)classStudentsAdmin(admin.ModelAdmin):
十七、视图基本使用
概述
在Django中,视图对web请求进行回应;视图其实就是一个python函数,在views.py文件中定义;
备注: 有几个页面就有几个视图
定义视图
fromd jango.http import HttpResponse
# 没有使用任何的模板
def index(request):
return HttpResponse('hello zyz!!!')
配置url (简单)
# 修改project/urls.py文件
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [ url(r'^admin/', admin.site.urls),
url(r'^', include('myapp.urls')),# 会定位到myapp.urls中]
# 在对应应用中appname中,创建urls.py文件(与上面文件类似)
from django.conf.urls import url
from . import views
# 导入视图
urlpatterns = [ url(r'^$', views.index)# 匹配到的就是views中的首页]
配置url (带参数)
# 描述(在views.py中定义的视图)
def detail(request,num):
return HttpResponse('detail-%s'% num)
# 在appname/urls.py中配置即可
urlpatterns = [ url(r'^$', views.index),
# 添加括号,其实就是正则表达式中的组的概念。
# 而匹配到的就是可以给到
detail(request,num)函数中的
numurl(r'^(\d+)/$', views.detail)]
十八、模板的基本使用
概念
模板是HTML页面,可以根据视图中传递过来的数据进行填充
创建模板目录
在project中创建模板目录templates;
在templares目录中,创建对应应用目录appname作为项目模板目录;
创建对应应用app的目录,因为一个项目可以创建多个app,这也方便对应
配置模板路径
# 修改settings.py文件中的TEMPLATES;
TEMPLATES = [{'BACKEND':'django.template.backends.django.DjangoTemplates',
# 添加模板目录# 开头部分都有定义BASE_DIR,即项目其实目录'DIRS': [os.path.join(BASE_DIR,'templates')],'APP_DIRS':True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages', ], },},]
模板语法
{{输出值,变量或对象属性}}
{%执行代码段%}
需求1
# 在网址中输入127.0.0.1/grades时,将所有班级显示出来# 在网址中输入127.0.0.1/students时,将所有学生显示出来- 先创建一个模板(project/templates/appname/) grades.html students.html- 模板代码(基本页面显示)- 创建对应视图
# 班级页defgrades(request):pass- url控制器(在myapp/urls.py中分发) url(r'^grades/$', views.grades),- 视图中的具体操作
# 班级页
from.modelsimportGradesdefgrades(request):
# 通过模型取出数据库中对应表单数据
gradeList = Grades.objects.all()
# 将数据传递给模板(模板将数据渲染上之后再返回)
returnrender(request,'myapp/grades.html',{'grades': gradeList})
需求2
# 在班级信息中点击时,显示对应班级信息- 每个班级点击时,URL都会有变化
{{grade.gname}}- 匹配不同的视图
url(r'^grades/(\d+)$', views.gradeStudents),
# 班级对应学生页- 视图中的具体操作
# 对应班级的学生信息
def gradeStudents(request,gradeid):
# 获取对应班级对象
grade = Grades.objects.get(pk=gradeid)
# 对应班级的学生studentList = grade.students_set.all()
# 都是学生信息都是一样显示(即模板是一致的)
# 就是数据源不一样
returnrender(request,'myapp/students.html',{'students':studentList})
链接:https://www.jianshu.com/p/d3b87efb555d