Django圖書管理系統(前端對有外鍵的數據表增刪改查)

 

 

 

圖書管理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})
views.py

 

將數據庫修改以後報錯:刪掉1處,從新在新的數據庫插入數據

 修改鏈接的數據庫

 

這裏只是將斷開鏈接點的數據庫在pycharm上移除,而不是刪除後臺數據庫

修改數據結構,再修改下代碼,就改爲學員管理系統

 

演示級聯刪除:

級聯刪除成功:一對多,刪一,多中對應的都刪

相關文章
相關標籤/搜索