创建一个新的项目test2,应用名依然叫bookltest,目录结构如下:
Django配置使用mysql数据库
修改test2/settings.py中的DATABASES
注意:django框架不会自动帮我们生成mysql数据库,所以我们需要自己去创建
配置完数据库后需要安装pymysql包,pip install pymysql,安装完后需要在test2/__init__.py里添加如下内容:
import pymysql
pymysql.install_as_MySQLdb()
然后可以启动服务。
复习案例
1、设计模型类并生成表
- 设计BookInfo,增加属性b_read和b_comment,另外设置软删除标记属性isDelete。
- 设计HeroInfo类,增加软删除标记属性isDelete。
软删除标记:删除数据时不做真正的删除,而是把标记数据设置为1表示删除,目的是防止重要的数据丢失。
2、编写视图函数并配置URL。
3、创建模板文件。
拆解功能:
1、图书信息展示页。
- 设计url,通过浏览器访问 http://127.0.0.1:8000/index/ 时显示图书列表页。
- 设计url对应的视图函数index,查询出所有图书的信息,将这些信息传递给模板文件。
- 编写模板文件index.html,遍历显示出每一本图书的信息并增加新建和删除超链接。
2、图书信息新增
- 设计url,通过浏览器访问 http://127.0.0.1:8000/create/ 时向数据库中增加一条图书
b) 设计url对应得视图函数create,并重定向到/index显示图书页
3、图书信息删除
- 设计url,通过浏览器访问 http://127.0.0.1:8000/delete数字/ 删除数据库中对应的一条图书数据,其中数字是点击的图书的id。
- 设计url对应的视图函数delete,获取图书的id,进行删除,并重定向到/index显示图书页
4、测试数据
在数据库命令行中,复制如下语句执行,向booktest_bookinfo表中插入测试数据:
insert into booktest_bookinfo(b_title,b_pubdate,b_read,b_comment,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(h_name,h_gender,h_book_id,h_comment,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);
重定向
页面重定向:服务器不返回页面,而是告诉浏览器再去请求其他的url地址
示例代码:
booktest/models.py
from django.db import models
# Create your models here.
class BookInfo(models.Model):
"""图书模型类"""
b_title = models.CharField(max_length=20) # 书名
b_pubdate = models.DateField() # 出版日期
b_read = models.IntegerField() # 阅读量
b_comment = models.IntegerField() # 评论量
isDelete = models.BooleanField(default=False) # 软删除标记
class HeroInfo(models.Model):
"""英雄模型类"""
h_name = models.CharField(max_length=20) # 英雄名
h_gender = models.BooleanField(default=False) # 性别
h_kungfu = models.CharField(max_length=200) # 功夫
h_book = models.ForeignKey('BookInfo') # 关系属性
isDelete = models.BooleanField(default=False) # 软删除标记
booktest/views.py
import datetime
import random
from django.shortcuts import render, redirect # 重定向函数
from django.http import HttpResponse, HttpResponseRedirect
from booktest.models import BookInfo, HeroInfo
# Create your views here.
def index(request):
"""显示图书信息"""
# 查询所有图书信息
book_list = BookInfo.objects.all()
# 使用模版
return render(request, 'booktest/index.html', {'book_list': book_list})
def create(request):
"""随机新增一本图书"""
book_list = [
('书剑恩仇录', '1955-4-6'), ('碧血剑', '1956-9-6'), ('天龙八部', '1966-5-23'),
('飞狐外传','1957-10-6'), ('鸳鸯刀','1961-11-6'), ('连城诀','1969-5-23')
]
book = random.choice(book_list)
# 创建BookInfo对象
b = BookInfo()
b.b_title = book[0]
b.b_pubdate = datetime.date(*map(int, book[1].split('-'))) # 将字符串转换date格式
b.b_read = 0
b.b_comment = 0
# 保存数据
b.save()
# return HttpResponse('ok')
# 返回应答,让浏览器访问/index首页, 重定向
# return HttpResponseRedirect('/index')
return redirect('/index')
def delete(request, b_id):
"""删除点击的图书"""
# 获取b_id对应图书
book = BookInfo.objects.get(id=b_id)
# 删除
book.delete()
# 重定向·让浏览器访问/index首页
# return HttpResponseRedirect('/index')
return redirect('/index')
booktest/urls.py
from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^index/$', views.index), # 显示所有图书信息
url(r'^create$', views.create), # 新增一本图书
url(r'^delete(\d+)$', views.delete), # 删除点击的图书
]
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书信息</title>
</head>
<body>
<a href="/create">新增</a>
<br>
图书信息如下:
<ul>
{#遍历图书列表#}
{% for book in book_list %}
<li>{{ book.b_title }} ---- <a href="/delete{{ book.id }}">删除</a>
</li>
{% endfor %}
</ul>
</body>
</html>
效果展示