图书管理系统共分为两篇博客进行讲解,该篇博客主要记录图书与出版社之间的关系(一对一),记录图书的增删查改操作
==================================================
一、数据库设计
图书管理系统共分为三个角色:图书,出版社,作者
一本书 ======== 一个出版社
一本书 ======== 多个作者
一个作者 ======= 多本书
出版社与书之间的关系:一对多的关系 =====》外键
书于作者之间的关系:多对多的关系 =====》用第三张表做关联
=================================================
二、代码部分(只记录代码部分,使用的一些其他操作,可以根据我以前的记录进行学习)
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请求的参数
原文地址:https://www.cnblogs.com/fjiqiang/p/10874830.html