1 -入门
虚拟环境
- 在开发过程中,当需要使用python的包时可以联网安装
sudo pip install 包名称
- 使用如上命令,会将包安装到/usr/local/lib/python2.7/dist-packages下
- 接下来问题就出来了,如果在一台机器上,想开发多个不同的项目,需要用到同一个包的不同版本,如果还使用上面的命令,在同一个目录下安装或者更新,其它的项目必须就无法运行了,怎么办呢?
- 解决方案:虚拟环境
- 虚拟环境可以搭建独立的python运行环境,使得单个项目的运行环境与其它项目互不影响
- 所有的虚拟环境,都位于/home/下的隐藏目录.virtualenvs下
创建
- 安装虚拟环境的命令如下
sudo pip install virtualenv
sudo pip install virtualenvwrapper
- 创建虚拟环境的命令如下:
mkvirtualenv 虚拟环境名称
mkvirtualenv py_django
- 此时使用的python版本与默认版本相同,默认是使用python2
- 指定python版本的命令如下:
mkvirtualenv -p python路径 虚拟环境名称
退出
deactivate
- 删除虚拟环境的命令如下:
rmvirtualenv 虚拟环境名称
安装django包
官方文档: https://docs.djangoproject.com/zh-hans/2.0/
pip install django==1.8.2
创建图书管理项目
- 在django中,项目的组织结构为一个项目包含多个应用,一个应用对应一个业务模块
- 示例:创建项目的名称为test1,完成“图书-英雄”信息的维护,创建应用名称为booktest
创建项目
- 在当前用户的某个目录下创建项目,这样不会发生权限问题
- 示例中在桌面上创建了pytest目录,今后的项目都会创建在这个目录下
cd /home/Desktop/
mkdir pytest
- 打开pycharm,点击File->New Project菜单:

- 点击菜单后出现如下窗口:

- 点击create后出现如下窗口

- 点击ok后创建项目成功
项目默认目录说明
- 默认目录结构如下图:

- manage.py是项目运行的入口,指定配置文件路径
- 与项目同名的目录,此处为test1,包含项目的配置文件
- init.py是一个空文件,作用是这个目录test1可以被当作包使用
- settings.py是项目的整体配置文件
- urls.py是项目的URL配置文件
- wsgi.py是项目与WSGI兼容的Web服务器入口,详细内容会在part6的布署中讲到
创建应用
- 使用一个应用开发一个业务模块,此处创建应用名称为booktest,完成图书英雄的信息维护
- 打开Terminal窗口,执行如下命令创建应用的命令如下:
python manage.py startapp 应用名称
python manage.py startapp booktest

- 创建应用后,项目目录结构如下

- init.py是一个空文件,表示当前目录booktest可以当作一个python包使用
- tests.py文件用于开发测试用例,在实际开发中会有专门的测试人员,这个事情不需要我们来做
- 其它文件和目录会在稍后的开发中使用到,会逐个讲解
安装应用
- 应用创建成功后,需要安装才可以使用
- 在test1/settings.py中INSTALLED_APPS下添加应用的名称就可以完成安装
- 初始项目的INSTALLED_APPS如下图:

- 在元组中添加一个新的项,当前示例为booktest
'bootest',

运行
- 在开发阶段,为了能够快速预览到开发的效果,django提供了一个纯python编写的轻量级web服务器,仅在开发阶段使用
- 可以在Terminal运行如下命令启动服务器:
python manage.py runserver ip:port
python manage.py runserver
- 参数ip、port可以省略不写
- 默认ip为127.0.0.1
- 默认端口为8000
- 在pycharm中启动服务器按钮如下图:

- 窗口run会被打开,如下图:

- 在浏览器中输入网址“127.0.0.1:8000”,网站效果如下图

- 如果增加、修改、删除python文件,服务器会自动重启
- 如果想关闭服务器可以使用ctrl+c或点击run窗口的红色方块按钮
设计模型
- 当前项目的开发,都是数据驱动的,即分析出项目中所需要存储的数据,然后设计数据表及表结构,接下来再使用设计好的页面对表完成数据的crud
- django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的crud
- 使用django进行数据库开发的步骤如下:
- 1.在models.py中定义模型类
- 2.迁移
- 3.通过类和对象完成数据crud
1.定义模型类
- 模型类定义在models.py文件中,继承自models.Model类
- 说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长
- 图书表结构设计:
- 表名:BookInfo
- 图书名称:btitle
- 图书发布日期:bpub_date
- 英雄表结构设计:
- 表名:HeroInfo
- 英雄姓名:hname
- 英雄性别:hgender
- 英雄简介:hcontent
- 所属图书:hbook
- 图书-英雄的关系为一对多
- 根据设计,在models.py中定义模型类如下
from django.db import models class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateField() def __str__(self): return "%d" % self.pk class HeroInfo(models.Model): hname = models.CharField(max_length=20) hgender = models.BooleanField() hcontent = models.CharField(max_length=100) hBook = models.ForeignKey('BookInfo') def __str__(self): return "%d" % self.pk
查看数据库
- 在settings.py中关于数据库的默认配置如下图:

- 表示采用sqlite3数据库,并将文件放在项目目录下
- 从下次课开始使用mysql数据库,会讲解如何配置mysql数据库
- 运行过服务器后,会生成数据库文件,如下图:

- 可以在pycharm中查看数据库,按下图打开database面板

-
在database面板中按下图打开选择数据库窗口

- 选择数据库窗口如下图,找到项目目录下的db.sqlite3文件:

- 如果未安装驱动,点击安装驱动即可
- 打开数据库后窗口如下图:

3.迁移
- 迁移由两步完成
- 1.生成迁移文件:根据模型类生成创建表的语句
- 2.执行迁移:根据第一步生成的语句在数据库中创建表
- 打开Terminal窗口,编写如下命令:
python manage.py makemigrations

- 执行迁移命令如下:
python manage.py migrate

- 其它数据表是django已经定义好的功能,可以直接使用
- 在database面板中刷新后如下图,对应的两张表被创建成功:

后台管理
- 站点分为内容发布和公共访问两部分
- 内容发布的部分由网站的管理员负责查看、添加、修改、删除数据,开发这些重复的功能是一件单调乏味、缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块
- 使用Django的管理模块,需要按照如下步骤操作
- 1.管理界面本地化
- 2.创建管理员
- 3.注册模型类
- 4.自定义管理页面
1.管理界面本地化
- 本地化是将显示的语言、时间等使用本地的习惯,这里的本地化就是进行中国化,中国大陆地区使用简体中文,时区使用亚洲/上海时区,注意这里不使用北京时区表示
- 打开test1/settings.py文件,找到语言编码、时区的设置项,将内容改为如下
LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai'
2.创建管理员
- 在Terminal中执行如下命令,用于创建管理员
python manage.py createsuperuser
- 效果如下图:

- 打开浏览器,在地址栏中输入如下地址后回车
http://127.0.0.1:8000/admin/

- 输入前面创建的用户名、密码完成登录

- 登录成功后界面如下,但是并没有图书、英雄的管理入口,接下来进行第三步操作

3.注册模型类
- 登录后台管理后,默认没有我们创建的应用中定义的模型类,需要在自己应用中的admin.py文件中注册,才可以在后台管理中看到,并进行crud操作
- 打开booktest/admin.py文件,编写如下代码
from django.contrib import admin from models import BookInfo,HeroInfo admin.site.register(BookInfo) admin.site.register(HeroInfo)
- 到浏览器中刷新页面,可以看到模型类BookInfo和HeroInfo的管理了

- 点击类名称“BookInfo”可以进入列表页,默认只有一列,显示的是str方法返回的值

- 在列表页中点击“增加”可以进入增加页,Django会根据模型类的不同,生成不同的表单控件,按提示填写表单内容后点击"保存",完成数据创建,创建成功后返回列表页

- 在列表页中点击某行的第一列可以进入修改页

- 按照提示进行内容的修改,修改成功后进入列表页
- 在修改页点击“删除”可以删除一项

- 删除:在列表页勾选想要删除的复选框,可以删除多项

- 点击执行后进入确认页面,删除后回来列表页面

- 数据都删除了,接下来手动造一些数据出来
4.自定义管理页面
- 在列表页只列出了str方法的返回值,对象的其它属性并没有列出来,查看非常不方便
- Django提供了自定义管理页面的功能,比如列表页要显示哪些值
- 打开booktest/admin.py文件,自定义类,继承自admin.ModelAdmin类
- 属性list_display表示要显示哪些属性
class BookInfoAdmin(admin.ModelAdmin): list_display = ['pk', 'btitle', 'bpub_date']
- 修改模型类BookInfo的注册代码如下
admin.site.register(BookInfo, BookInfoAdmin)
- 刷新BookInfo的列表页,所有属性都显示出来了

- 最终booktest/admin.py文件代码如下
from django.contrib import admin from models import BookInfo,HeroInfo class BookInfoAdmin(admin.ModelAdmin): list_display = ['pk', 'btitle', 'bpub_date'] class HeroInfoAdmin(admin.ModelAdmin): list_display = ['pk', 'hname','hgender','hcontent'] admin.site.register(BookInfo,BookInfoAdmin) admin.site.register(HeroInfo,HeroInfoAdmin)
视图
- 后台管理页面做好了,接下来就要做公共访问的页面了
- 对于django的设计框架MVT,用户在URL中请求的是视图,视图接收请求后进行处理,并将处理的结果返回给请求者
- 使用视图时需要进行两步操作
- 1.定义视图
- 2.配置URLconf
1.定义视图
- 视图就是一个Python函数,被定义在views.py中
- 视图的第一个参数是HttpRequest类型的对象reqeust,包含了所有请求的信息
- 视图必须返回HttpResponse对象,包含返回给请求者的响应信息
- 打开booktest/views.py文件,定义视图index如下
#coding:utf-8 from django.http import HttpResponse def index(request): return HttpResponse("index")
2.配置URLconf
- 查找视图的过程:请求者在浏览器地址栏中输入url,请求到网站后,获取url信息,然后与编写好的URLconf逐条匹配,如果匹配成功则调用对应的视图,如果所有的URLconf都没有匹配成功,则返回404错误
- 一条URLconf包括url规则、视图两部分
- url规则使用正则表达式定义
- 视图就是在views.py中定义的视图
- 需要两步完成URLconf配置
- 1.在应用中定义URLconf
- 2.包含到项目的URLconf中
- 1.在booktest/应用下创建urls.py文件,定义代码如下
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index), ]
- 2.包含到项目中:打开test1/urls.py文件,为urlpatterns列表增加项如下
url(r'^', include('booktest.urls')),
- test1/urls.py文件完整代码如下
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^', include('booktest.urls')), ]
请求访问
- 视图和URLconf都定义好了,接下来在浏览器地址栏中输入网址
http://127.0.0.1:8000/
- 网页显示效果如下图,视图被成功执行了

模板
- 如何向请求者返回一个漂亮的页面呢?肯定需要用到html、css,如果想要更炫的效果还要加入js,问题来了,这么一堆字段串全都写到视图中,作为HttpResponse()的参数吗?这样定义就太麻烦了吧,因为定义字符串是不会出任何效果和错误的,如果有一个专门定义前端页面的地方就好了
- 解决问题的技术来了:模板
- 在Django中,将前端的内容定义在模板中,然后再把模板交给视图调用,各种漂亮、炫酷的效果就出现了
创建模板
- 为应用booktest下的视图index创建模板index.html,目录结构如下图:

- 设置查找模板的路径:打开test1/settings.py文件,设置TEMPLATES的DIRS值
'DIRS': [os.path.join(BASE_DIR, 'templates')],

定义模板
- 打开templtes/booktest/index.html文件,定义代码如下
- 在模板中输出变量语法如下,变量可能是从视图中传递过来的,也可能是在模板中定义的
{{变量名}}
- 在模板中编写代码段语法如下
{%代码段%}
- 定义模板内容如下
<html>
<head>
<title>图书列表</title>
</head>
<body>
<h1>{{title}}</h1>
{%for i in list%}
{{i}}<br>
{%endfor%}
</body>
</html>
视图调用模板
- 调用模板分为三步骤
- 1.找到模板
- 2.定义上下文
- 3.渲染模板
- 打开booktst/views.py文件,调用上面定义的模板文件
#coding:utf-8 from django.http import HttpResponse from django.template import loader,RequestContext def index(request): # 1.获取模板 template=loader.get_template('booktest/index.html') # 2.定义上下文 context=RequestContext(request,{'title':'图书列表','list':range(10)}) # 3.渲染模板 return HttpResponse(template.render(context))
- 打开浏览器刷新页面,显示效果如下图

视图调用模板简写
- 视图调用模板都要执行以上三部分,于是Django提供了一个函数render封装了以上代码
- 方法render包含3个参数
- 第一个参数为request对象
- 第二个参数为模板文件路径
- 第三个参数为字典,表示向模板中传递的上下文数据
- 打开booktst/views.py文件,调用render的代码如下
#coding:utf-8 from django.shortcuts import render def index(request): context={'title':'图书列表','list':range(10)} return render(request,'booktest/index.html',context)
项目完成
- 基本知识点都学完了,接下来完成示例项目
- 现在还需要的代码包括三个方面,三个方面顺序不分先后
- 1.定义视图
- 2.定义URLconf
- 3.定义模板
定义视图
- 编写booktest/views.py文件如下
from django.shortcuts import render from models import BookInfo #首页,展示所有图书 def index(reqeust): #查询所有图书 booklist = BookInfo.objects.all() #将图书列表传递到模板中,然后渲染模板 return render(reqeust, 'booktest/index.html', {'booklist': booklist}) #详细页,接收图书的编号,根据编号查询,再通过关系找到本图书的所有英雄并展示 def detail(reqeust, id): #根据图书编号对应图书 book = BookInfo.objects.get(pk=id) #将图书信息传递到模板中,然后渲染模板 return render(reqeust, 'booktest/detail.html', {'book': book})
定义URLconf
- 编写booktest/urls.py文件如下
from django.conf.urls import url #引入视图模块 from . import views urlpatterns = [ #配置首页url url(r'^$', views.index), #配置详细页url,\d+表示多个数字,小括号用于取值,建议复习下正则表达式 url(r'^(\d+)$',views.detail), ]
定义模板
- 编写templates/booktest/index.html文件如下
<html>
<head>
<title>首页</title>
</head>
<body>
<h1>图书列表</h1>
<ul>
{#遍历图书列表#}
{%for book in booklist%}
<li>
{#输出图书名称,并设置超链接,链接地址是一个数字#}
<a href="{{book.id}}">{{book.btitle}}</a>
</li>
{%endfor%}
</ul>
</body>
</html>
- 编写templates/booktest/detail.html文件如下
<html>
<head>
<title>详细页</title>
</head>
<body>
{#输出图书标题#}
<h1>{{book.btitle}}</h1>
<ul>
{#通过关系找到本图书的所有英雄,并遍历#}
{%for hero in book.heroinfo_set.all%}
{#输出英雄的姓名及描述#}
<li>{{hero.hname}}---{{hero.hcontent}}</li>
{%endfor%}
</ul>
</body>
</html>
-
总结
- 安装配置django运行的环境
- 编写模型,使用API与数据库交互
- 使用django的后台管理管理数据
- 通过视图接收请求,通过模型获取数据
- 调用模板完成展示

浙公网安备 33010602011771号