1. 程式人生 > >Django框架之圖書管理系統(一)

Django框架之圖書管理系統(一)

manage model request 名稱 from 模型 nag clu llb

圖書管理系統共分為兩篇博客進行講解,該篇博客主要記錄圖書與出版社之間的關系(一對一),記錄圖書的增刪查改操作

==================================================

一、數據庫設計

圖書管理系統共分為三個角色:圖書,出版社,作者

一本書 ======== 一個出版社

一本書 ======== 多個作者

一個作者 ======= 多本書

出版社與書之間的關系:一對多的關系 =====》外鍵

書於作者之間的關系:多對多的關系 =====》用第三張表做關聯

=================================================

二、代碼部分(只記錄代碼部分,使用的一些其他操作,可以根據我以前的記錄進行學習)

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