Django框架之图书管理系统(一)
图书管理系统共分为两篇博客进行讲解,该篇博客主要记录图书与出版社之间的关系(一对一),记录图书的增删查改操作
==================================================
一、数据库设计
图书管理系统共分为三个角色:图书,出版社,作者
一本书 ======== 一个出版社
一本书 ======== 多个作者
一个作者 ======= 多本书
出版社与书之间的关系:一对多的关系 =====》外键
书于作者之间的关系:多对多的关系 =====》用第三张表做关联
=================================================
二、代码部分(只记录代码部分,使用的一些其他操作,可以根据我以前的记录进行学习)
1.创建一个app04模块,作为图书管理系统模块;在系统中注册模板文件夹和静态文件夹
2.创建图书与出版社的模型类,models.py代码如下:
from django.db import models # Create your models here. class Publisher(models.Model):
"""
出版社模型类
"""
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=20) class Books(models.Model):
"""
图书模型类
"""
id=models.AutoField(primary_key=True)
bookname=models.CharField(max_length=24)
publisher=models.ForeignKey(to="Publisher")
通过两个命令在数据库中创建这两个类的表
3.查
3.1 views.py中代码如下:
def show_bookmanager(request):
"""
查询所有的图书记录
:param request:
:return:
"""
get_all_books=Books.objects.all() # 通过ORM进行查询所有的数据
return render(request,"allbooks.html",{"books":get_all_books})
3.2 项目同名文件夹下的url路径配置,urls.py中代码如下:
urlpatterns = [
url(r'^app04/',include('app04.urls')),
]
3.2 在app04模块下配置url路径,app04/urls.py中代码如下:
urlpatterns=[
url(r'^allbooks/$',show_bookmanager),
]
3.4 前端allbooks.html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form>
<table border="1">
<tr>
<td>ID</td>
<td>book</td>
<td>publisher</td>
</tr>
{% for book in books %}
<tr>
<td>{{ book.id }}</td>
<td>{{ book.bookname }}</td>
<td>{{ book.publisher.title }}</td>
</tr>
{% endfor %} </table>
</form>
</body>
</html>
启动manage.py通过http://127.0.0.1:8000/app04/allbooks/就可以通过浏览器访问图书的所有信息了
通过上述查的例子已经能查出所有的图书信息了,那么下面的步骤基本上和上面一致,就直接进行代码记录,最后总结里面的相关知识点
4.增
4.1 app04/urls.py代码如下:
urlpatterns=[
url(r'^allbooks/$',show_bookmanager),
url(r'^addbook/$',add_bookmanager),
]
4.2 views.py代码如下:
def add_bookmanager(request):
"""
添加图书信息
:param request:
:return:
"""
# 如果是通过get方法进行请求的数据,查询所有的出版社,用于显示到添加界面,供用户进行选择出版社
if request.method=="GET":
all_publisher = Publisher.objects.all()
return render(request,"addbooks.html",{"publishers":all_publisher})
# 如果通过post方法进行请求的数据,获取前端传递过来图书名称、出版社名称,然后插入到数据库中
if request.method=="POST":
get_book=request.POST.get('txtbookname',None) # 获取前端传递过来的图书名称
get_pulisher=request.POST.get('selectpublisher',None) # 获取前端传递过来的出版社名称
a=Books.objects.create(bookname=get_book,publisher_id=get_pulisher) # 插入数据
return redirect("/app04/allbooks/") # 通过重定向,显示所有的数据
4.3 前端代码,在allbooks.html中添加一个跳转链接
<a href="/app04/addbook/">添加图书</a>
addbooks.html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/app04/addbook/" method="post">
<input type="text" name="txtbookname"/>
<select name="selectpublisher">
{% for p in publishers %}
<option value="{{ p.id }}">{{ p.title }}</option>
{% endfor %}
</select>
<input type="submit" value="添加"/>
</form>
</body>
</html>
5.删
5.1 app04/urls.py代码如下:
urlpatterns=[
url(r'^allbooks/$',show_bookmanager),
url(r'^addbook/$',add_bookmanager),
url(r'^delete/$',delete_bookmanager),
]
5.2 views.py代码如下:
def delete_bookmanager(request):
"""
删除图书信息
:param request:
:return:
"""
get_id=request.GET.get('id') # 获取前端传递过来的数据
if get_id: # 如果获取到了前端传递过来的数据,进行下一步
delete_book=Books.objects.get(id=get_id) # 通过id获取到对应的图书信息
delete_book.delete() # 删除对应的信息
return redirect("/app04/allbooks/")
5.3 前端allbooks.html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form>
<a href="/app04/addbook/">添加图书</a>
<table border="1">
<tr>
<td>ID</td>
<td>book</td>
<td>publisher</td>
<td>operation1</td>
</tr>
{% for book in books %}
<tr>
<td>{{ book.id }}</td>
<td>{{ book.bookname }}</td>
<td>{{ book.publisher.title }}</td>
<td><a href="/app04/delete/?id={{ book.id }}">删除</a></td>
</tr>
{% endfor %} </table>
</form>
</body>
</html>
6.改
6.1 app04/urls.py代码如下:
urlpatterns=[
url(r'^allbooks/$',show_bookmanager),
url(r'^addbook/$',add_bookmanager),
url(r'^delete/$',delete_bookmanager),
url(r'^editor/$',editor_bookmanager),
]
6.2 views.py代码如下:
def editor_bookmanager(request):
"""修改图书信息"""
if request.method=="GET":
get_id=request.GET.get('id') # 获取前端传递过来参数为id的数据
if get_id:
get_book=Books.objects.get(id=get_id) # 根据id获取到对应的数据信息
get_publisher=Publisher.objects.all() # 查询出所有的出版社信息
return render(request,"editorbooks.html",{"book":get_book,"publishers":get_publisher})
else:
return redirect("/app04/allbooks/")
if request.method=="POST":
get_id=request.POST.get('updateid')
get_name=request.POST.get('updatename')
get_publisher=request.POST.get('selectpublisher')
# 以下四句代码都是进行修改数据的代码
editor_book=Books.objects.get(id=get_id)
editor_book.bookname=get_name
editor_book.publisher_id=get_publisher
editor_book.save()
return redirect("/app04/allbooks/")
6.3前端editorbooks.html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/app04/editor/" method="post">
<input type="text" name="updateid" value="{{ book.id }}" style="display: none;"/>
<input type="text" name="updatename" value="{{ book.bookname }}"/> <select name="selectpublisher">
{% for publisher in publishers %}
{% if book.publisher_id == publisher.id %}
<option selected value="{{ publisher.id }}" >{{ publisher.title }}</option>
{% else %}
<option value="{{ publisher.id }}">
{{ publisher.title }}
</option>
{% endif %}
{% endfor %}
</select>
<input type="submit" value="更新"/>
</form>
</body>
</html>
============================================
总结:
1.一对多关系
class Publisher(models.Model):
"""
出版社模型类
"""
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=20) class Books(models.Model):
"""
图书模型类
"""
id=models.AutoField(primary_key=True) # 表的id,AutoField是自动增长,相当于设置auto_increment
bookname=models.CharField(max_length=24) # 表的name,CharField是数据库中的varchar,max_length必须设置
publisher=models.ForeignKey(to="Publisher") # 表的外键,这是一对多关键的所在,to="Publisher"表示关联Publisher模型类的主键
一对多的关系,主要在于设置外键,在该例子中图书是多,出版社是一的关系。
2.增删查改
在该例子中,如果想对图书类进行操作,就相当于对Books类进行操作,具体如下:
查:Books.objects.all() 查询出所有的信息,相当于sql语句:select * from 图书表
Books.objects.get(id=1) 查询出id=1的图书信息,相当于sql语句:select * from 图书表 where id=1;
增:Books.objects.create(bookname="高等数学") 添加bookname="高等数学"的图书信息,相当于sql语句:insert into 图书表 (bookname) values ('高等数学');
删:Books.objects.get(id=1).delete() 删除id=1的图书信息,详单与sql语句:delete from 图书表 where id=1
改:editor_book=Books.objects.get(id=1)
editor_book.bookname="离散数学"
editor_book.save()
相当于sql语句:update 图书表set bookname="离散数学" where id=1;
3.request.GET.get('id',None) 表示获取get方法请求的参数,如果没有获取到,返回None,不会报错
request.GET['id'] 表示获取get方法请求的参数,如果没有获取到,会程序报错
同理:request.POSTget("id",None)和request.POST['id']的方法和上面介绍的方法类似,唯一的区别在于这两个方法是获取POST请求的参数
Django框架之图书管理系统(一)的更多相关文章
- Django框架之图书管理系统(二)
该篇文章介绍多对多的关系介绍 一.数据库设计 一个作者对应多个书籍 一个书籍对应多个作者 总结也就是多对多之间的关系 通过模型类创建多对多之间的关系表的时候,Django框架通过ORM创建三个表,分别 ...
- Python-Flask框架之——图书管理系统 , 附详解源码和效果图 !
该图书管理系统要实现的功能: 1. 可以通过添加窗口添加书籍或作者, 如果要添加的作者和书籍已存在于书架上, 则给出相应的提示. 2. 如果要添加的作者存在, 而要添加的书籍书架上没有, 则将该书籍添 ...
- 新建Django项目示例--图书管理系统
知识点: Django 1. 安装 1. Django版本 1.11.xx 2. 安装方式 1. 命令行 --> Python环境(双版本,pip的使用) 2. PyCharm安装 2. 创建D ...
- Python-Flask框架之"图书管理系统"项目,附详解源代码及页面效果截图
该图书管理系统要实现的功能如下: 1. 可以通过添加窗口添加书籍或作者,如果要添加的作者和书籍已存在于书架上, 则给出相应的提示: 2. 如果要添加的作者存在,而要添加的书籍书架上没有,则将该书籍添加 ...
- Python高级进阶(二)Python框架之Django写图书管理系统(LMS)
正式写项目准备前的工作 Django是一个Web框架,我们使用它就是因为它能够把前后端解耦合而且能够与数据库建立ORM,这样,一个Python开发工程师只需要干自己开发的事情就可以了,而在使用之前就我 ...
- 在Django中使用ORM创建图书管理系统
一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等 ...
- Django——图书管理系统
基于Django的图书管理系统 1.主体功能 1.列出图书列表.出版社列表.作者列表 2.点击作者,会列出其出版的图书列表 3.点击出版社,会列出旗下图书列表 4.可以创建.修改.删除 图书.作者.出 ...
- Django数据库查询优化-事务-图书管理系统的搭建
数据库查询优化 优化:虽然减轻了数据库的压力,但查询速度大大的减慢 ORM内所有的语句操作,默认都是惰性查询,只有你在真正的需要数据的时候才会走数据, 如果你只是写ORM语句时,是不会走数据库的,这样 ...
- Django学习——分组查询、图书管理系统项目、wsgi, uwsgi, cgi, fastcgi
1 分组查询 # 分组查询 # 查询每一个出版社id,以及图书平均价格(单表) # 原生sql # select publish_id,avg(price) from app01_book group ...
随机推荐
- [NOIP2017(TG/PJ)] 真题选做
[NOIPTG2017] 小凯的疑惑 题意 小凯有两种面值的金币,每种金币有无数个,求在无法准确支付的物品中,最贵的价值是多少金币. 分析 设两种金币面值分别为 $a$ 和 $b \; (a<b ...
- Python入门3 —— 基本数据类型
一:为何变量值(记录的数据)要有类型呢? 1.既然可以记录事物的状态,为什么要分类型呢? 变量值是来记录事物状态的, 而事物的状态是多种多样的, 所以对应着就要应该用不同类型的值去记录这些状态. 二: ...
- html表单提交给PHP然后浏览器显示出了PHP的源代码
今天学习到PHP处理网页表单提交的数据时,碰到一个巨头疼的问题,先贴上案例代码: html表单部分: <html> <head> <meta charset=" ...
- 图的bfs遍历模板(邻接矩阵存储和邻接表存储)
bfs遍历图模板伪代码: bfs(u){ //遍历u所在的连通块 queue q; //将u入队 inq[u] = true; while (q非空){ //取出q的队首元素u进行访问 for (从u ...
- Rabbitmq consumer端超时报错
0x01 应用场景: 使用rabbitmq的exchange模式,type为direct,消费端不需要向生产端返回结果no_ack=True 其中某个consumer任务耗时较长(5min以上),结果 ...
- python-调用自己写的函数
在同一个目录下的话,直接在代码里添加即可,下面的例子. 同一个目录下有以下: aaa.py ccc.py ddd.py 想在ddd.py里用aaa.py里的函数,就在ddd.py里面开关位置添加 ...
- html中的路径详解
路径指文件存放的位置,在网页中利用路径可以引用文件,插入图像.视频等.表示路径的方法有两种:相对路径,绝对路径.以下讨论均是在HTML环境下进行. 相对路径 相对路径是指目标相对于当前文件的路径,网页 ...
- 微信小程序中showToast 提示
icon可以none,也可以 success wx.showToast({ title: '已提交', icon: 'success', duration: 2000 })
- 吴裕雄 python 机器学习——数据预处理过滤式特征选取VarianceThreshold模型
from sklearn.feature_selection import VarianceThreshold #数据预处理过滤式特征选取VarianceThreshold模型 def test_Va ...
- electron-vue + element-ui构建桌面应用
最近需要用Node.js做一个桌面的应用,了解到electron可以用来做跨平台的桌面应用,而vue可以用来作为界面的解决方案,研究了一会儿如何把他们两个整合到一起使用,遇到了各种问题而放弃,毕竟作为 ...