上一章我们创建了新的项目,并更换了数据库,接下来我们在新的项目test2
中定义模型类
打开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')#英雄与图书表的关系为一对多,所以属性定义在英雄模型类中
- 这次我们定义了新的属性:阅读量、评论量、逻辑删除
- 注意体会IntegerField和BooleanField的用法
下一步是迁移:
python manage.py makemigrations
python manage.py migrate
由于我们现在使用的是MySql数据库,所以可以打开数据库的命令行查看我们的数据库。
测试数据
在数据库命令行中,复制如下语句执行,向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);
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
from booktest.models import BookInfo
from datetime import date
from django.http import HttpResponse, HttpResponseRedirect
#查询所有图书并显示
def index(request):
books = BookInfo.objects.all()
return render(request, 'booktest/index.html', {'books': books})
配置urls
在booktest
下新建urls.py
并输入:
from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^index$', views.index),
]
在test2/urls.py内新增
from django.urls import path, include
path('', include('booktest.urls'))
新建模板
在templates
下新建文件夹booktest
,在booktest
下新建文件index.html
在index.html中输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书信息</title>
</head>
<body>
<ul>
{% for book in books %}
<li>{{ book.btitle }}</li>
{% endfor %}
</ul>
</body>
</html>
终于可以runserver了
效果:
现在我们想给这个页面一个新建的功能。
首先在html中新建一个链接标签:
<body>
<a href="/create">新增</a>
<ul>
{% for book in books %}
<li>{{ book.btitle }}</li>
{% endfor %}
</ul>
</body>
然后我么回到views.py新增一个create类,用来实现给BookInfo新增‘流星蝴蝶剑’的功能:
def create(request):
"""新增一本图书"""
# 1.创建一个BookInfo对象
b = BookInfo()
b.btitle = '流星蝴蝶剑'
b.bpub_date = date(1990,1,1)
# 2.保存进数据库
b.save()
# 3.返回应答,让浏览器再访问index(重定向)
#return HttpResponse('ok')
return HttpResponseRedirect('/index')
关于HttpResponseRedirect
按照我们以前学习的方法,在这里其实写到第二步就结束了,第三步写一个return HttpResponse('ok')
用来提示我们新增成功。
但是以这种方法,我们点击新建之后会跳转到一个只写着ok的页面,我们需要返回index页面并刷新才能看到新增的图书,这样太麻烦了。
如果我们想点击新增之后,页面自动刷新,就需要重定向功能HttpResponseRedirect
。
页面重定向:服务器不返回页面,而是告诉浏览器再去请求其他的url地址。
接下来给create
配置url:
url(r'^create$', views.create)
刷新页面,现在点击新增之后页面就会自动刷新并返回新的内容: