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框架之圖書管理系統(一)