01 Django基础知识
-
相关概念
-
软件框架
- 一个公司是由公司中的各部部门来组成的,每一个部门拥有特定的职能,部门与部门之间通过相互的配合来完成让公司运转起来。
- 一个软件框架是由其中各个软件模块组成的,每一个模块都有特定的功能,模块与模块之间通过相互配合来完成软件的开发
- 软件框架是针对某一类软件设计问题而产生的
-
MVC 框架
- MVC最初是由施乐公司旗下的帕罗奥多研究中心中的一位研究人员给 smalltalk语言发明的一种软件设计模式。
-
MVC的产生理念: 分工
- 让专门的人去做专门的事。
- MVC的核心思想: 解耦。
- MVC的思想被应用在的web开发的方面,产生了web MVC框架。
-
Web MVC 框架模块功能
-
示意图:通过浏览器注册用户信息
- M:Model 模型,和数据库进行交互
- V:View 视图,产生 html 页面
- C:Controller,控制器,接收请求,进行处理,与 M 和 V 进行交互,返回应答
-
-
-
Django 框架简介
-
简介
- Django是劳伦斯出版集团的开发人员为开发新闻内容网站而设计出来的一个软件
- 它遵循MVC思想,但是有自己的一个名词,叫做MVT
-
Django遵循快速开发和DRY原则
- Do not repeat yourself.不要自己去重复一些工作
- 在线文档
-
MVT 各部分功能
-
示意图
- M:Model, 模型, 和 MVC 中 M 功能相同,和数据库进行交互。
- V:View,视图, 和 MVC 中 C 功能相同,接收请求,进行处理,与 M 和 T 进行交互,返回应答
- T:Template, 模板, 和 MVC 中 V 功能相同,产生 html 页面
-
-
-
虚拟环境
-
概念
-
在同一个 python 环境中安装同一个包的不同版本,后安装的包会把原来安装的包覆盖掉
- 如果同一台机器上两个项目依赖于相同包的不同版本,则会导致一些项目运行失败
- 解决的方案就是:虚拟环境。
- 虚拟环境是真实 python 环境的复制版本
- 在虚拟环境中使用的 python 是复制的 python,安装 python 包也是安装在复制的 python 中
-
-
安装和配置
-
安装
-
-
sudo pip install virtualenv #安装虚拟环境 sudo pip install virtualenvwrapper #安装虚拟环境扩展包 |
-
编辑家目录下的 .bashrc 文件,添加下面三行
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.5# python 文件位置,要指明版本,不然会和 conda 的包混淆 export WORKON_HOME=$HOME/.virtualenvs# 虚拟文件的位置 source /usr/local/bin/virtualenvwrapper.sh |
-
使得 .bashrc 文件生效
source .bashrc |
-
使用
-
虚拟环境创建与删除
-
# 创建虚拟环境命令: mkvirtualenv 虚拟环境名 # 创建指定 python 版本的虚拟环境: mkvirtualenv -p python3.5 bj11_py3 # 进入虚拟环境工作 workon 虚拟环境名 # 查看机器上有多少个虚拟环境: workon 空格 + 两个tab键 # 退出虚拟环境 deactivate # 删除虚拟环境: rmvirtualenv 虚拟环境名 |
-
软件包的安装
# 虚拟环境下安装包的命令: pip install 包名 # 注意:不能使用sudo pip install 包名,这个命令会把包安装到真实的主机环境上而不是安装到虚拟环境中。
# 查看虚拟环境中安装了哪些python包: pip list pip freeze # 安装特定版本的 django 环境: pip install django==1.8.2 |
-
Django 项目创建与基本使用
-
创建项目
-
命令
-
-
django-admin startproject 项目名 |
- 创建应用时,必须先进入相应的虚拟环境
-
项目目录
-
示意图
-
相关文件的功用
- __init__.py: 说明 test_django 是一个python包。
- settings.py: 项目的配置文件
- urls.py: 进行 url 路由的配置
- wsgi.py: web 服务器和 Django 交互的入口
- manage.py: 项目的管理文件
-
-
创建应用
-
在 Django 中,一个功能模块使用一个应用来实现
-
创建应用的命令
-
python manage.py startapp 应用名 |
-
应用目录
-
相关文件的功用
- __init__.py: 说明目录是一个Python模块。
- models.py: 写和数据库项目的内容, 设计模型类。
-
views.py: 接收请求,进行处理,与M和T进行交互,返回应答。
- 定义处理函数,视图函数
- tests.py: 写测试代码的文件
- admin.py: 网站后台管理相关的文件
-
-
应用注册
- 建立应用和项目之间的联系,需要对建立的应用进行注册
-
修改 settings.py 中的 INSTALLED_APPS 配置项
-
启动项目
-
运行开发web服务器命令:
-
python manage.py runserver |
-
模型类(M Models)
-
ORM,对象关系映射
-
示意图
- django中内嵌了ORM框架,ORM框架可以将类和数据表进行对应起来
- 只需要通过类和对象就可以对数据表进行操作
- 在Django中主要是设计模型类来实现 ORM
- ORM另外一个作用:根据设计的类生成数据库中的表
-
-
模型类设计
- 在应用 model.py 中设计模型类
- 必须继承于 models.Model 类
-
Models.ForeignKey可以建立两个模型类之间一对多的关系
- django在生成表的时候,就会在多端的表中创建一列作为外键,建立两个表之间一对多的关系
-
示例的 model.py 文件
-
from django.db import models
# 设计和表对应的类,即为模型类 # Create your models here.
# 一类 # 图书类 class BookInfo(models.Model): """图书类模型""" # CharField 说明是一个字符串,max_length 指定最大字符串长度 btitle = models.CharField(max_length=20) # DataField 说明是一个日期类型 bpub_date = models.DateField()
def __str__(self): """返回图书类的标题""" return self.btitle
# 多类 # 英雄人物类 # 英雄名 hname # 性别 hgender # 年龄 hage # 备注 hcomment # 关系属性,建立图书类和英雄类之间的关系 class HeroInfo(models.Model): """英雄人物类属性""" hname = models.CharField(max_length=20) # BooleanFileld 说明是布尔类,default 指定默认值,False表示男 hgender = models.BooleanField(default=False) hcomment = models.CharField(max_length=128) # 关系属性,hbook 建立图书类和英雄类之间的关系 # 关系属性对应的表的字段名格式:关系属性名_id hbook = models.ForeignKey('BookInfo')
def __str__(self): """返回英雄名""" return self.hname |
-
模型类生成表
-
生成迁移表
-
命令
-
-
python manage.py makemigrations |
-
示意图
- 迁移文件是根据模型类生成的
-
执行迁移生成表
-
命令
-
python mange.py migrate |
- 根据迁移文件生成表
-
生成表名的默认格式:
- 应用名_模型类名小写
-
通过模型类来操作数据表
-
进入项目 shell 的命令
-
python manage.py shell |
-
以下例子需要在项目 shell 终端中运行
# 首先导入模型类: from booktest.models import BookInfo,HeroInfo # 1)向booktest_bookinfo表中插入一条数据。 b = BookInfo() #定义一个BookInfo类的对象 b.btitle ='天龙八部' #定义b对象的属性并赋值 b.bpub_date = date(1990,10,11) b.save() #才会将数据保存进数据库 # 2) 查询出booktest_bookinfo表中id为1的数据。 b = BookInfo.objects.get(id=1) # 3) 在上一步的基础上改变b对应图书的出版日期。 b.bpub_date = date(1989,10,21) b.save() #才会更新表格中的数据 # 4) 紧接上一步,删除b对应的图书的数据。 b.delete() #才会删除 # 5) 向booktest_heroInfo表中插入一条数据。 h = HeroInfo() h.hname = '郭靖' h.hgender = False h.hcomment = '降龙十八掌' b2 = BookInfo.objects.get(id=2) h.hbook = b2#给关系属性赋值,英雄对象所属的图书对象 h.save() # 6) 查询图书表里面的所有内容。 BookInfo.objects.all() HeroInfo.objects.all() |
-
关联操作
-
示意图
-
相关命令
-
# 查询出id为2的图书中所有英雄人物的信息。 b = BookInfo.objects.get(id=2) #查询出b图书中所有英雄人物的信息 b.heroinfo_set.all() |
-
后台管理
-
本地化
- 语言和时区的本地化
-
修改 settings.py 文件
-
创建管理员
-
命令
-
-
python manage.py createsuperuser |
-
注册模型类
-
在应用下的 admin.py 中注册模型类
- 让 django 框架根据注册的模型类来生成对应的管理界面
-
-
自定义管理界面
-
自定义模型管理类
- 确定 django 在生成的管理界面上显示哪些内容
-
-
注册模型类与自定义管理界面的实例
-
admin.py
-
from django.contrib import admin from booktest.models import BookInfo, HeroInfo # 后台管理的相关文件 # Register your models here.
class BookInfoAdmin(admin.ModelAdmin): """自定义模型管理类, 图书模型管理类""" list_display = ['id', 'btitle', 'bpub_date']
class HeroInfoAdmin(admin.ModelAdmin): """自定义模型管理类, 英雄模型管理类""" list_display = ['id', 'hname', 'hgender', 'hcomment', 'hbook_id']
# 注册模型类 admin.site.register(BookInfo, BookInfoAdmin) admin.site.register(HeroInfo, HeroInfoAdmin) |
-
视图
- 在Django中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求的,视图函数处理之后,要给浏览器返回页面内容
-
定义视图函数
- 视图函数定义在views.py中
- 视图函数必须有一个参数request,进行处理之后,需要返回一个HttpResponse的类对象
-
实例
from django.shortcuts import render from django.http import HttpResponse from django.template import loader, RequestContext from booktest.models import BookInfo, HeroInfo
# Create your views here.
def my_render(request, template_path, context_dict={}): """加载模板文件""" # 使用模板文件 # 1. 加载模板文件, 获得模板对象 temp = loader.get_template(template_path) # 2. 定义模板上下文:给模板文件传递数据 context = RequestContext(request, context_dict) # 3. 模板渲染 res_html = temp.render(context) # 4. 返回给浏览器 return HttpResponse(res_html)
# 1. 定义视图函数,HTTPRequest # 2. 进行 url 配置,建立 url 地址和视图的对应关系 def index(request): # 进行处理,和 M 与 T 进行交互 # return HttpResponse("程序正常运行,哈哈哈") return my_render(request, "booktest/index.html") |
-
进行 url 配置
-
配置流程图
- url 配置的目的是让建立 url 和视图函数的对应关系
- url 配置项定义在 urlpatterns 的列表中,每一个配置项都调用 url 函数。
- url 函数有两个参数,第一个参数是一个正则表达式,第二个是对应的处理动作。
-
配置url时,有两种语法格式:
- url(正则表达式,视图函数名)
- url(正则表达式,include(应用中的urls文件))
- 工作中在配置 url 时,首先在项目的 urls.py 文件中添加配置项时,并不写具体的 url 和视图函数之间的对应关系
-
而是通过 include 将其指向具体应用的 urls.py 文件
- 在应用的 urls.py 文件中写 url 和视图函数的对应关系。
-
-
url 匹配过程
- 在项目的urls.py文件中包含具体应用的urls.py文件,应用的urls.py文件中写url和视图函数的对应关系
-
示意图
-
·过程
- 当用户输入如 http://127.0.0.1:8000/aindex 时,去除域名和最前面的 /,剩下 aindex
- 拿aindex字符串到项目的urls文件中进行匹配,配置成功之后,去除匹配的a字符
- 剩下的index字符串继续到应用的urls文件中进行正则匹配,匹配成功之后执行视图函数index
- index视图函数返回内容 hello python 给浏览器来显示
-
模板
- 模板不仅仅是一个 html 文件
-
模板文件的使用
-
创建模板文件夹
-
配置模板目录 settings.py
-
模板文件的处理过程
-
加载模板文件
- 去模板目录下面获取html文件的内容,得到一个模板对象。
-
定义模板上下文
- 向模板文件传递数据。
-
模板渲染
- 得到一个标准的html内容
- 实例
-
-
-
给模板文件传递数据
-
模板变量的使用
- {{ 模板变量名 }}
-
模板代码段
- {%代码段%}
-
for 循环
-
{% for i in list %} list不为空时执行的逻辑 {% empty %} list为空时执行的逻辑 {% endfor %} |
-
views 通过字典传送数据
-
实例
-
def show_books(request): """显示图书信息""" # 1. 通过 M 查找图书表中的数据 books = BookInfo.objects.all() # 2. 使用模板 return render(request, "booktest/show_book.html", {'books': books}) |
-
案例
-
编码之前的准备工作:
- 设计出访问页面的 url 和对应的视图函数的名字,确定视图函数的功能。
- 设计模板文件的名字
-
以下为案例中的简单设计过程:
-
完成图书信息的展示:
- 设计url,通过浏览器访问 http://127.0.0.1:8000/books 时显示图书信息页面。
- 设计url对应的视图函数show_books。
- 查询出所有图书的信息,将这些信息传递给模板文件。
- 编写模板文件show_books.html。
- 遍历显示出每一本图书的信息
-
完成点击某本图书时,显示出图书里所有英雄信息的页面
- 设计url,通过访问 http://127.0.0.1:8000/books/数字 时显示对应的英雄信息页面
- 这里数字指点击的图书的id
-
设计对应的视图函数detail
- 接收图书的id,根据id查询出相应的图书信息,然后查询出图书中的所有英雄信息
-
id 信息可以通过正则表达式的分组匹配获取
-
示例 urls.py
-
-
-
from django.conf.urls import url from booktest import views
# 在应用的 urls 文件中进行 url 配置的时候: # 1. 需要严格的匹配开关和结尾 # 2. 从上到下匹配,一旦匹配成功,就会在 url 地址中去掉匹配项 urlpatterns = [ # 通过 url 函数设置 url 路由配置项 url(r"^index/?$", views.index),# 建立/index 和视图 index 之间的关系 url(r"^index2/?$", views.index2),# 建立/index 和视图 index 之间的关系 url(r"^books/?$", views.show_books),# 显示图书信息 url(r"^books/(\d+)$", views.detail)# 使用正则表达式的分组传入 ] |
- 编写模板文件detail.html