返回顶部

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
View Code

查看数据库

  • 在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)
View Code

视图

  • 后台管理页面做好了,接下来就要做公共访问的页面了
  • 对于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))
View Code
  • 打开浏览器刷新页面,显示效果如下图

 

视图调用模板简写

  • 视图调用模板都要执行以上三部分,于是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})
View Code

 

 

定义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),
]
View Code

定义模板

 

  • 编写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>
View Code
  • 编写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>
View Code
  1. 总结

    1. 安装配置django运行的环境
    2. 编写模型,使用API与数据库交互
    3. 使用django的后台管理管理数据
    4. 通过视图接收请求,通过模型获取数据
    5. 调用模板完成展示

 

posted @ 2017-12-02 00:13  Crazymagic  阅读(168)  评论(0)    收藏  举报