本系列主要为Django入门教程,通过简单几步,可以快速入门Django。
系列目录:
5、[Python] Django框架入门5——静态文件、中间件、上传图片和分页
说明:Django框架入门
当前项目环境:python3.5、django-1.11
项目名:test1
应用名:booktest
命令可简写为:python manager.py xxx => ./manager.py xxx
准备:已经安装python并加入环境变量
已安装 django
设计框架对比(引用,可自行搜索):
1、MVC
MVC框架的核心思想是:解耦
降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
m表示model,主要用于对数据库的封装
v表示view,用于向用户展示结果
c表示controller,是核心,用户处理请求,获取数据,返回结果
2、MVT
Django属于MVT框架
m表示model,负责与数据库交互
v表示view,是核心,负责接收请求、获取数据、返回结果
t便是template,负责呈现内容到浏览器
个人觉得两种框架基本大同小异
一、开始
1、创建项目:test1
> django-admin startproject test1
2、进入test1目录创建应用:booktest
> python manager.py startapp booktest
创建完成,可以看到项目下booktes目录
3、启动服务器,测试
> python manager.py runserver [8080]
端口号可以指定,默认8000
打开浏览器访问 : 127.0.0.1:8080
二、创建模型:
打开booktest目录下的 models.py文件,编辑如下
1 from django.db import models 2 """ 3 models文件的作用: 4 1、根据models的定义去生成SQL语句,并创建表 5 2、创建对象,对对象进行各种操作 6 图书-英雄的关系为一对多 7 """ 8 9 10 # 图书表 11 class BookInfo(models.Model): 12 # 默认自动生成id 13 # 图书名称 14 btitle = models.CharField(max_length=20) 15 # 图书发布时间 16 bpub_data = models.DateTimeField() 17 18 def __str__(self): 19 return self.btitle 20 21 22 23 # 英雄表 24 class HeroInfo(models.Model): 25 # 英雄姓名 26 hname = models.CharField(max_length=10) 27 # 英雄性别 28 hgender = models.BooleanField() 29 # 英雄简介 30 hcontent = models.CharField(max_length=500) 31 # 所属图书 : 外键引用对象 32 hbook = models.ForeignKey(BookInfo)
三、生成数据表
1、激活模型:编辑settings.py文件,将booktest应用加入到INSTALLED_APPS下,编辑之后如下:
1 INSTALLED_APPS = [ 2 'django.contrib.admin', 3 'django.contrib.auth', 4 'django.contrib.contenttypes', 5 'django.contrib.sessions', 6 'django.contrib.messages', 7 'django.contrib.staticfiles', 8 'booktest', # 我们添加的应用 9 ]
数据库使用默认的sqlite
2、生成迁移文件:根据模型类型生成sql语句
> python manager.py makemigrations
结果如下所示:
3、执行迁移:执行sql语句生成数据表
> python manager.py migrate
四、测试数据库操作:进入django的shell进行测试
> python manager.py shell
1、添加记录,并查看
五、定义视图
这里为了方便处理,在booktest应用下新建了一个urls.py文件,方便管理
1、Route配置
① 查看setting.py文件如下:
ROOT_URLCONF = 'test1.urls'
② 修改test1/urls.py文件如下:
1 from django.conf.urls import url, include 2 from django.contrib import admin 3 4 5 urlpatterns = [ 6 url(r'^admin/', admin.site.urls), 7 # 使用应用的urls 8 url(r'^', include('booktest.urls')) 9 ]
③ 在booktest目录下新建urls.py文件,编辑如下:
1 from django.conf.urls import url 2 from . import views 3 4 urlpatterns = [ 5 # 首页的处理方法 6 url(r'^$', views.index) 7 ]
2、修改视图文件 booktest/views.py
1 from django.http import * 2 3 4 def index(request): 5 # 打印 字符串 6 return HttpResponse("Hello Django")
3、测试视图,结果如下
六、定义模板(这里仅仅对模板进行展示,更多模板操作,可查阅官方文档)
1、创建templates目录,并添加文件 index.html,编辑 index.html文件:
2、 修改settings.py文件,编辑如下:
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 修改目录
3、修改视图文件 views.py
1 from django.shortcuts import render 2 from django.http import * 3 from django.template import RequestContext, loader 4 5 6 def index(request): 7 # # 加载模板 render() 渲染模板 8 # tmp = loader.get_template('booktest/index.html') 9 # return HttpResponse(tmp.render()) 10 return render(request, 'booktest/index.html')
4、测试,刷新页面
附录一:使用Django提供管理站点,对数据库进行管理
1、创建管理用户
> python manager.py createsuperuser
按照要求输入账号、邮箱、密码
2、打开网页,登录
浏览器访问地址(根据自己的情况):127.0.0.1:8000/admin
进入管理站点,默认可以对groups、users进行管理,如下:
3、管理界面本地化(显示为中文、修改时区)
修改配置文件settings.py 如下:
1 # LANGUAGE_CODE = 'en-us' 2 LANGUAGE_CODE = 'zh-hans' 3 4 # TIME_ZONE = 'UTC' 5 TIME_ZONE = 'Asia/Shanghai'
语言代码与版本有关:1.8之后使用“zh-hans”,之前是“zh-cn”
4、自定义管理界面
Django提供了admin.ModelAdmin类,来定义模型在Admin界面显示的方式
需要在django提供的管理站点进行管理model,则需要修改应用下的admin.py文件如下:
1 from django.contrib import admin 2 from .models import * 3 4 5 # 如果需要通过/admin进行管理,需要进行注册 6 admin.site.register(BookInfo) 7 admin.site.register(HeroInfo)
如果对页面有更多的要求、显示更多内容,则如下更改admin.py:
1 from django.contrib import admin 2 from .models import * 3 4 5 class HeroInfoInline(admin.TabularInline): 6 """ 7 关联对象注册 8 可以继承的父类: 9 1-层叠显示:admin.TabularInline 10 2-表格显示:admin.StackedInline 11 """ 12 model = HeroInfo 13 extra = 3 14 15 16 class BookInoAdmin(admin.ModelAdmin): 17 # 1、列表页属性 18 # 显示字段:可以点击列头进行排序 19 list_display = ['id', 'btitle', 'bpub_data'] 20 # 过滤字段:过滤框会出现在右侧 21 list_filter = ['btitle'] 22 # 搜索字段:搜索框会出现在上侧 23 search_fields = ['btitle'] 24 # 分页:分页框会出现在下侧 25 list_per_page = 10 26 27 # 2、修改、添加页属性 28 # 属性分组 29 fieldsets = [ 30 ('base', {'fields': ['btitle']}), 31 ('super', {'fields': ['bpub_data']}) 32 ] 33 # 关联的对象 34 inlines = [HeroInfoInline] 35 36 37 class HeroInfoAdmin(admin.ModelAdmin): 38 # 显示字段:可以点击列头进行排序 39 list_display = ['id', 'hname', 'gender', 'hcontent'] 40 41 42 # 如果需要通过/admin进行管理,需要进行注册 43 admin.site.register(BookInfo, BookInoAdmin) 44 admin.site.register(HeroInfo, HeroInfoAdmin)
下图为列表页面:对应上图的BookInfoAdmin中以为 list_xxx 开头的字段
下图为修改、新增页面:对属性进行分组,对应上面代码的BookInfoAdmin的 fieldsets字段
5、管理对象的注册
修改admin.py文件如下:
6、布尔值显示
修改models.py文件如下
修改models.py文件