以“图书-英雄”的管理为示例,使用Django完成基本流程的开发,学习Django的主要知识。
安装Django
pip install django
说明:使用pip install django命令进行安装时,会自动删除旧版本,再安装新版本
创建项目
命令:django-admin startproject test1
说明:上面命令中"test1"为你所需要创建的项目名
进入test1目录,目录结构如下:
说明:
- manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互
- test1:项目真正的Python包
- __init__.py:一个空文件,Python包所必需的文件
- settings.py:项目的配置文件
- urls.py:项目的URL声明
- wsgi.py:项目与WSGI兼容的Web服务器入口
设计介绍
本项目完成“图书-英雄”信息的维护,需要存储两种数据:图书、英雄
图书表结构设计:
表名:BookInfo
图书名称:btitle
图书发布时间:bpub_date
英雄表结构设计:
表名:HeroInfo
英雄姓名:hname
英雄性别:hgender
英雄简介:hcontent
所属图书:hbook
图书-英雄的关系为一对多
数据库配置
在settings.py文件中,通过DATABASES项进行数据库设置
# Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
Django支持的数据包括:sqlite、mysql等主流数据库
Django默认使用sqlite数据库
创建应用
在一个项目可以创建一到多个应用,每个应用进行一种业务处理
创建应用的命令:python manage.py startapp booktest
说明:上面命令中的"booktest"为你所需创建的应用名
应用的目录结构如下:
定义模型端
有一个数据表,就有一个模型类与之对应
打开models.py文件,定义模型类
引入包from django.db import models
模型类继承自models.Model类
说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长
当输出对象时,会调用对象的str方法
# booktest/models.py from django.db import models """ 图书表结构设计: 表名:BookInfo 图书名称:btitle 图书发布时间:bpub_date 英雄表结构设计: 表名:HeroInfo 英雄姓名:hname 英雄性别:hgender 英雄简介:hcontent 所属图书:hbook 图书-英雄的关系为一对多 """ # Create your models here. # 图书类 class BookInfo(models.Model): btitle = models.CharField(max_length = 20) bpub_date = models.DateTimeField() def __str__(self): return self.btitle # 英雄类 class HeroInfo(models.Model): hname = models.CharField(max_length = 20) hgender = models.NullBooleanField() hcontent = models.CharField(max_length = 1000) hbook = models.ForeignKey('BookInfo') def __str__(self): return self.hname
生成数据表
激活模型:编辑settings.py文件,将booktest应用加入到INSTALLED_APPS中
# Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'booktest', ]
生成迁移文件:根据撒高端生成sql语句:python manage.py makemigrations
迁移文件生成到应用的migrations目录中
执行迁移:执行sql语句生成数据表:python manage.py migrate
测试数据操作
进入python shell,进行简单的模型API练习:python manage.py shell
进入shell后提示如下:
# 引入需要的包:
from booktest.models import BookInfo, HeroInfo
from datetime import *
# 新建图书信息
b = BookInfo()
b.btitle = "射雕英雄传"
b.bpub_date = datetime(year = 1990, month = 1, day = 10)
b.save()
# 查询所有图书信息:
BookInfo.objects.all()
# 根据条件查询图书信息(pk为主键)
b = BookInfo.objects.get(pk = 1)
# 输出图书信息
b
b.id
b.btitle
# 修改图书信息
b.btitle = "天龙八部"
b.save()
# 删除图书信息
b.delete()
关联对象的操作
对于HeroInfo可以按照上面的操作方式进行
添加,注意添加关联对象
h = HeroInfo()
h.htitle = "郭靖"
h.hgender = True
h.hcontent = "降龙十八掌"
h.hbook = b
h.save()
服务器
运行如下命令可以开户服务器:python manage.py runserver ip:port
说明:
可以不写ip,默认端口为8000
这是一个纯python编写的轻量级web服务器,仅在开发阶段使用
服务器成功启动后,提示如下信息
默认端口是8000,可以修改端口:python manage.py runserver 8080
打开浏览器,输入网址“127.0.0.1:8000”就可以打开默认页面了
通过CTRL+C停止服务器运行
管理操作
站点分为“内容发布”和“公共访问”两个部分
“内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力的工作。为此,Django会根据定义的模型类完全自动地生成管理模块。
使用Django管理
创建一个管理员用户:python manage.py createsuperuser
然后按提示信息输入用户名、邮箱、密码
启动服务器,通过“127.0.0.1:8000/admin”访问,输入上面创建的用户名、密码完成登录
进入管理站点,默认可以对groups(组)、users(用户)进行管理
管理界面本地化
编辑settings.py文件,设置编码、时区
LANGUAGE_CODE = 'zh-Hans'#'en-us' TIME_ZONE = 'Asia/Shanghai'#'UTC'
向admin注册booktest模型
打开booktest/admin.py文件,注册模型
from django.contrib import admin from .models import BookInfo, HeroInfo # Register your models here. # 注册 admin.site.register(BookInfo) admin.site.register(HeroInfo)
刷新管理页面,可以对BookInfo的数据进行增、删、改、查等操作
自定义管理页面
from django.contrib import admin from .models import BookInfo, HeroInfo # Register your models here. # HeroInfo采用关联注册 class HeroInfoInline(admin.TabularInline): model = HeroInfo extra = 2 # BookInfo管理类 class BookInfoAdmin(admin.ModelAdmin): # 列表页属性 # 显示字段:可以点击列头进行排序 list_display = ['pk', 'btitle', 'bpub_date'] # 过滤字段:过滤框会显示在右侧 list_filter = ['btitle'] # 搜索字段:搜索框会出现在左上侧 search_fields = ['btitle'] # 分页:分页框会出现在左下侧 list_per_page = 10 # 添加、修改页属性 # 属性的先后顺序 # fields = ['bpub_date', 'btitle'] # 属性分组 fieldsets = [ ('basic', {'fields': ['btitle']}), ('more', {'fields': ['bpub_date']}) ] # 关联 inlines = [HeroInfoInline] # 注册 admin.site.register(BookInfo, BookInfoAdmin) admin.site.register(HeroInfo)
视图
在Django中,视图对web请求进行回应
视图接收request对象作为第一个参数,包含了请求的信息
视图就是一个Python函数,被定义在views.py中
from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse("index") def detail(request, bid): return HttpResponse("detail %s" % bid)
定义完视图后,需要配置URLconf,否则无法处理请求
URLconf
在Django中,定义URLconf包括正则表达式、视图两个部分
Django使用正则表达式匹配请求的URL,一旦匹配成功,则调用应用的视图
注意:只匹配路径部分,即除去域名、参数后的字符串
test1/urls.py
from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', include('booktest.urls')), ]
booktest/urls.py
#!/usr/bin/python3 # -*- coding:utf-8 -*- """ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 作者:mayi 博客:http://www.cnblogs.com/mayi0312/ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # """ from django.conf.urls import url from .import views urlpatterns = [ url(r'^$', views.index), url(r'^bid=(d+)', views.detail), ]
模板
模板是html页面,可以根据视图中传递的数据填充值
创建模板的目录如下图:
修改settings.py文件,设置TEMPLATES的DIRS值
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', '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', ], }, }, ]
在模板中访问视图传递的数据
{{输出值,可以是变量,也可以是对象.属性}} {%执行代码段%}
定义index.html模板
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>首页</title> </head> <body> <B>图书列表</B> <ul> {%for book in book_list%} <li><a href="bid={{book.id}}">{{book.btitle}}</a></li> {%endfor%} </ul> </body> </html>
定义detail.html模板
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>详情页</title> </head> <body> <B>{{book_title}}:英雄列表</B> <ul> {%for hero in hero_list%} <li>{{hero.hname}}</li> {%endfor%} </ul> </body> </html>
使用模板
编辑views.py文件,在方法中调用模板
from django.shortcuts import render from django.http import HttpResponse from .models import BookInfo, HeroInfo # Create your views here. def index(request): book_list = BookInfo.objects.all() context = {'book_list': book_list} # return HttpResponse("index") return render(request, 'index.html', context = context) def detail(request, bid): book = BookInfo.objects.get(pk = bid) hero_list = book.heroinfo_set.all() context = {'book_title': book.btitle, 'hero_list': hero_list} # return HttpResponse("detail %s" % bid) return render(request, 'detail.html', context = context)
总结
- 安装配置Django运行的环境
- 编写模型,使用简单API与数据库交互
- 使用Django的后台管理中维护数据
- 通过视图接收请求,通过模型获取数据,展示出来
- 调用模板完成展示