圖書管理css
書籍管理 html
book git
name數據庫
項目源碼位置:https://gitee.com/machangwei-8/learning_materials/tree/master/%E9%A1%B9%E7%9B%AE/bookmanager02django
下載bootstrapbootstrap
引入到以前的網頁:服務器
將下面的網頁數據結構
使用下面的模板 https://v3.bootcss.com/examples/dashboard/app
起步->基本模板->控制檯ide
剛剛個人複製過來有問題,settings配置靜態文件目錄配置錯了,{},應該是[]。有文件可是沒有渲染上,報錯沒找到文件,配置文件弄錯了。
將源碼放到本身的文件中。將下面不要的刪除
下面的須要;
圓圈不須要刪掉:
刪掉:
下面只留一個li標籤
如今刪改並替換成這個樣子了:
將右下角的變成面板:使用以下樣式:
複製粘貼
將下面的放到面板中
格式化代碼
給它們是三個設置成按鈕
下面的地方修改一下:而且a標籤的地址改正確
下面的新增也改變一下,用剛纔那個面板
使用bootstrap
使用柵欄
選擇下面的這個表單替換面板的內容:
複製過來修改form post請求,加個name,
編輯頁面也作一下,和添加頁面差很少
class Book(models.Model):
title = models.CharField(max_length=32) pub = models.ForeignKey('Publisher', on_delete=models.CASCADE)
on_delete 在django2.0 版本以後是必填的參數 1.11 以前的能夠不填
on_delete 的參數 models.CASCADE models.SET() models.SET_DEFAULT models.SET_NULL
一個出版社能夠出版多本不一樣的書,一對多
on_delete是級聯刪除用的。一對多,外鍵在多,
級聯 刪一,多也刪,刪多,一不刪;非級聯刪1多不刪吧?
外鍵Publisher不加引號也能夠,可是必須方法Publisher類後面,而後是未定義。而這裏支持字符串,是使用反射的方法,book類在前在後均可以
on_delete 在django2.0 版本以後是必填的參數 1.11 以前的能夠不填
on_delete 的參數 models.CASCADE models.SET() models.SET_DEFAULT models.SET_NULL
還能夠設置默認值,設置爲空等等
這裏建立外鍵默認會在表中建立一個同名的加_id的字段。類中的這裏表明的是外鍵的一行數據,一個對象
orm一個類中設置了一個外鍵的類變量,這個類變量是外鍵所在類的一個對象(即外鍵所在類的一行數據的對象)。而在定義外鍵的這個類中,定義外鍵的那個字段是「外鍵類變量_id」來表示。
既然這樣,那我把models裏字段改爲pub。而後將剛剛的book刪除
刪除以後從新生成遷移文件,遷移的時候出了問題:
這是由於這裏有以前的操做記錄了,要刪掉
而後再執行顯示錶存在,再次刪掉這張表
修改爲功:
能夠直接複製粘貼
all_books = models.Book.objects.all() for book in all_books: print(book.title) print(book.pub,type(book.pub)) # ——> 所關聯的出版社對象 print(book.pub.pk) # 查id 多一次查詢 print(book.pub_id) # 直接在book表中查出的ID print(book.pub.name) print("*"*32)
如今作一個book_list的頁面
1)url,函數
2)函數render一個book_list.html
定義的外鍵是個對象,本表會加個_id(外鍵_id)做爲本表的字段。引用外表的其它字段時,外鍵.外表字段
所以這裏能夠:
在本張表中,1和2的區別是1作了兩次操做,先在本表拿到pub對象,再去另外一張表中找到那張表的主鍵。而2只作了一次操做,因此2效率高
三種方法以下:
models.Book.objects.create(title=book_name,pub=出版社的對象)
models.Book.objects.create(title=book_name,pub_id=pub_id)
新增邏輯以下;
這裏沒有東西:
數據表字段寫錯了報錯:應該是title : 'name' is an invalid keyword argument for this function
沒獲取到post傳過來的值,賦值到數據庫字段中是空的
添加書籍成功:
新建的這個對象,能夠對象.字段進行取值了
pk = request.GET.get('id') models.Book.objects.filter(pk=pk).delete()
實現book_listt頁面的刪除按鈕能夠獲取pk
函數編寫:
我寫的是小寫book類名,數據庫名字這裏沒有Book #沒有建立表的類或者類寫錯類名
成功刪除第一條帶有外鍵(出版社)的數據:
4處只匹配1,1後面有參數(2)是不用管的,在地址欄點擊回車拼接出來的地址就能刪除掉id是2的數據表記錄 #地址欄作刪除數據庫操做,(若是用戶有權限,那麼數據庫就能夠被刪數據)
刪除流程:服務器返回/book_list/的get請求結果
{% if book_obj.pub == publisher %} <option selected value="{{ publisher.pk }}"> {{ publisher.name }} </option> {% else %} <option value="{{ publisher.pk }}"> {{ publisher.name }} </option> {% endif %}
1)url,函數先實現返回編輯頁面
2)在book_list.html展現頁中添加編輯按鈕
3)建立edit_book.html,和添加頁面差很少。
已經能拿到要編輯的pk,應該還要拿到要編輯的書名和出版社,以及其它能夠經過下拉菜單作選擇的其它選項
顯示編輯的書名:
下拉選擇菜單數據傳進去:
使用下面語法添加判斷,知足條件的作另外的操做:
{% if edit_obj %} {% else %} {% endif %}
實現出版社默認顯示要編輯的對象的: 判斷從數據庫拿到的每一個出版社對象,若是==點擊編輯的edit_obj這個對象,那麼讓它是被選中的
編輯的邏輯過程;
對象.字段=獲取到的值 做爲賦予新的值,就是編輯,點賦值須要save保存的,跟create建立有區別的。
外鍵的從新賦值以下兩種方式:
book_obj.title = book_name # book_obj.pub_id = pub_id book_obj.pub = models.Publisher.objects.get(pk=pub_id) book_obj.save()
修改數據示例在上面的六、編輯數據中
from django.shortcuts import render,redirect,HttpResponse from app01 import models #展現出版社 def publisher_list(request): # 從數據庫中查詢到出版社的信息 all_publishers = models.Publisher.objects.all().order_by('pk') return render(request, 'publisher_list.html', {'all_publishers': all_publishers}) #publisher_list.html中使用的是字典中的鍵,鍵代替這個全部的對象 def add_publisher(request): error='' #返回一個包含from表單的出版社頁面 if request.method=='POST': publish_name=request.POST.get('publisher_name') # 判斷出版社名稱是否有重複的 if models.Publisher.objects.filter(name=publish_name): error='出版社名稱已存在' #判斷輸入值是否爲空 if not publish_name: error="輸入不能爲空" if not error: obj=models.Publisher.objects.create(name=publish_name) #跳轉到展現出版社的頁面 return redirect('/publisher_list/') return render(request,'add_publisher.html',{'error':error}) def del_publisher(request): # 獲取要刪除的數據 pk = request.GET.get('id') obj_list = models.Publisher.objects.filter(pk=pk) if not obj_list: # 沒有要刪除的數據 return HttpResponse('要刪除的數據不存在') # 刪除該數據 # obj.delete() obj_list.delete() # 跳轉到展現頁面 return redirect('/publisher_list/') def edit_publisher(request): error = '' # 查找要編輯的數據 pk = request.GET.get('id') # url上攜帶的參數 不是GET請求提交參數 obj_list = models.Publisher.objects.filter(pk=pk) if not obj_list: return HttpResponse('要編輯的數據不存在') obj = obj_list[0] if request.method == 'POST': # 處理POST請求 publisher_name = request.POST.get('publisher_name') # 獲取新提交的出版的名稱 if models.Publisher.objects.filter(name=publisher_name): error = '新修改的名稱已存在' # 新修改的名稱已存在 if obj.name == publisher_name: error = '名稱未修改' if not publisher_name: error = '名稱不能爲空' if not error: obj.name = publisher_name # 修改數據 obj.save() # 保存數據到數據庫中 # 跳轉到出版社的展現頁面 return redirect('/publisher_list/') return render(request, 'edit_publisher.html', {'obj': obj,'error':error}) # 返回一個包含原始數據的頁面 def book_list(request): books=models.book.objects.all() return render(request,'book_list.html',{'books':books}) def add_book(request): if request.method=='POST': new_name=request.POST.get('new_name') pub_id=request.POST.get('pub') models.book.objects.create(title=new_name,pub_id=pub_id) #或者pub=models.Publisher.objects.get('pub_id') return redirect('/book_list/') publishers=models.Publisher.objects.all() return render(request,'add_book.html',{'publishers':publishers}) def del_book(request): # 獲取要刪除的對象刪除 pk = request.GET.get('pk') models.book.objects.filter(pk=pk).delete() #刪除要刪除的對象 # 跳轉到展現頁面 return redirect('/book_list/') def edit_book(request): pk=request.GET.get('pk') edit_obj=models.book.objects.get(pk=pk) if request.method == 'POST': new_name=request.POST.get('new_name') pub_id=request.POST.get('pub_id') edit_obj.title=new_name edit_obj.pub_id=pub_id edit_obj.save() return redirect('/book_list/') publishers=models.Publisher.objects.all() return render(request,'edit_book.html',{'edit_obj':edit_obj,'publishers':publishers})
將數據庫修改以後報錯:刪掉1處,從新在新的數據庫插入數據
修改鏈接的數據庫
這裏只是將斷開鏈接點的數據庫在pycharm上移除,而不是刪除後臺數據庫
修改數據結構,再修改下代碼,就改爲學員管理系統
演示級聯刪除:
級聯刪除成功:一對多,刪一,多中對應的都刪