使用Mysql数据库完成一个MVT设计的图书英雄案例
创建项目
进入虚拟环境py_django
workon py_django
在用户目录下/pytest目录下创建项目(test3是项目名)。
cd pytest
django-admin startproject test3
打开test3/settings.py文件,找到DATABASES项,默认使用SQLite3数据库
(环境别忘调了)
修改为使用MySQL数据库,代码如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',#数据库
'NAME': 'test2', # 数据库名字
'USER':'root', #数据库登录用户名
'PASSWORD':'root',#数据库登录密码
'HOST':'localhost',#数据库所在主机
'PORT':3306, #数据库端口
}
}
注意:数据库test2 Django框架不会自动生成,需要我们自己进入mysql数据库去创建。使用navicat连接数据库
再使用mysql数据库时就会出现错误,把数据库切换成了mysql,需要安装pymysql模块之后,Django框架才可以操作mysql数据库。安装命令如下:
pip install pymysql
安装成功之后,在test3/init.py文件中加上如下代码:
import pymysql
pymysql.install_as_MySQLdb()
进入test3目录,创建应用booktest。
cd test3
python manage.py startapp booktest
将应用booktest注册到项目中:打开test3/settings.py文件,找到INSTALLED_APPS项,加入如下代码:
定义模型类
模型类被定义在"应用/models.py"文件中,此例中
- 为"booktest/models.py"文件。
- 模型类必须继承自Model类,位于包django.db.models中。
- 提示:对于重要数据使用逻辑删除。
打开booktest/models.py文件,定义模型类如下
from django.db import models
#定义图书模型类BookInfo
class BookInfo(models.Model):
#书名
btitle =models.CharField(max_length=20)
#出版日期
bpub_date=models.DateField()
#阅读数
bread=models.IntegerField(default=0)
#评论量
bcomment = models.IntegerField(default=0)
#逻辑删除
isDelete=models.BooleanField(default=False)
#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
# 英雄姓名
hname = models.CharField(max_length=20)
# 英雄性别
hgender = models.BooleanField(default=True)
# 逻辑删除
isDelete = models.BooleanField(default=False)
# 英雄描述信息
hcomment = models.CharField(max_length=200)
# 英雄与图书表的关系为一对多,所以属性定义在英雄模型类中
hbook = models.ForeignKey('BookInfo')
迁移
python manage.py makemigrations
python manage.py migrate
测试数据
右键数据库test2点击命令列界面插入数据
booktest_bookinfo表中插入测试数据
insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values
('射雕英雄传','1980-5-1',12,34,0),
('天龙八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飞狐','1987-11-11',58,24,0);
再复制如下语句执行,向booktest_heroinfo表中插入测试数据:
insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values
('郭靖',1,1,'降龙十八掌',0),
('黄蓉',0,1,'打狗棍法',0),
('黄药师',1,1,'弹指神通',0),
('欧阳锋',1,1,'蛤蟆功',0),
('梅超风',0,1,'九阴白骨爪',0),
('乔峰',1,2,'降龙十八掌',0),
('段誉',1,2,'六脉神剑',0),
('虚竹',1,2,'天山六阳掌',0),
('王语嫣',0,2,'神仙姐姐',0),
('令狐冲',1,3,'独孤九剑',0),
('任盈盈',0,3,'弹琴',0),
('岳不群',1,3,'华山剑法',0),
('东方不败',0,3,'葵花宝典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若兰',0,4,'黄衣',0),
('程灵素',0,4,'医术',0),
('袁紫衣',0,4,'六合拳',0);
定义视图
打开booktest/views.py文件,定义视图代码如下:
from django.shortcuts import render, redirect
from booktest.models import *
from datetime import date
# Create your views here.
# 显示图书列表
def index(request):
# 查询所有的图书信息
booklist = BookInfo.objects.all()
return render(request, 'booktest/index.html', {'booklist':booklist})
# 点击这本书,接下来显示这本书里所有的英雄
def detail(request, bid):
# 根据书号进行查询
book = BookInfo.objects.get(id=int(bid))
# 查找book图书的所有英雄
heros = book.heroinfo_set.all()
return render(request,'booktest/detail.html',{'book':book,'heros':heros})
# 增加一本书
def create(request):
book = BookInfo()
book.btitle = '天涯明月刀'
book.bpub_date = date(1999, 2, 4)
book.save()
return redirect('/')
# 删除一本书
def delete(request, bid):
# 根据id获取这个图书对象
book = BookInfo.objects.get(id=int(bid))
book.delete()
return redirect('/')
配置url
打开test3/urls.py文件,配置url如下:
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')),
]
在booktest应用下创建urls.py文件,代码如下:
from django.conf.urls import include, url
from booktest import views
urlpatterns = [
url(r'^$', views.index),
url(r'^(\d+)/$', views.detail),
url(r'^create/$', views.create),
url(r'^delete(\d+)/$', views.delete),
]
创建模板
打开test3/settings.py文件,配置模板查找目录TEMPLATES的DIRS。
'DIRS': [os.path.join(BASE_DIR,'templates')],
创建index.html和detail.html文件
index.html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书列表</title>
</head>
<body>
<h1>图书列表</h1>
<a href="/create/">创建一本书</a>
<ul>
{# 遍历图书的列表#}
{%for book in booklist%}
<li>
<a href="{{ book.id }}">{{ book.btitle }}</a> 阅读数量{{ book.bread }}
====> <a href="/delete{{ book.id }}">删除</a>
</li>
{%endfor%}
</ul>
</body>
</html>
detail.html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ book.btitle }}</h1>
<ul>
{%for hero in heros %}
<li>{{ hero.hname }}======》{{ hero.hcomment }}</li>
{%endfor %}
</ul>
</body>
</html>
运行
python manage.py runserver
运行初始页面
创建一本书——天涯明月刀(写死的)
删除天龙八部
点击笑傲江湖书名链接