Django圖書管理系統項目的搭建


基礎配置:

新創一個django項目,取名為homework_book

在setting里進行基礎配置

DATABASES={    
    'default':{
        'ENGINE' : 'django.db.backends.mysql',  #連接MYSQL數據庫
        'NAME' : 'bookhomework',   #設置連接的庫名
        'HOST':'127.0.0.1',         #設置本地連接方式
        'POST':3306,                  #設置端口號
        'USER':'root',                 #以root用戶權限登陸數據庫
        'PASSWORD':'',              #寫入sql數據庫登陸密碼,沒有設置不寫
        'OPTIONS':{                  #設置嚴格模式
    'init_command':'set sql_mode="STRICT_TRANS_TABLES"',
        }
    }
}
(嚴格模式的設置:當傳入一個字符串大於設置本身最大長度字符串時,就會報錯,這樣不會傳入一個截取不了全部的字符) STATIC_URL
= '/static/' #別名設置 ,別名的設置讓html文件直接引入改路徑,即使別名名稱更改,也不要緊 STATICFILES_DIRS=[ os.path.join(BASE_DIR,'statics') ]

在與settings.py文件同級目錄下的__init__文件中設置

import pymysql
pymysql.install_as_MySQLdb()

在models.py文件中寫入數據,是給數據庫中的表格添加數據類型:

from django.db import models   #引入models模塊

# Create your models here.
class Book(models.Model):

    name=models.CharField(max_length=32)#設置名字,類型為字符串類型,最大長度為32個字符
    price=models.FloatField()#設置價格,類型為浮點型
    date=models.DateField() #設置時間
    publisher=models.CharField(max_length=32)#設置出版社名稱,名字最大長度為32個字節
    

運行manage.py,輸入命令,進行數據庫表格數據的同步:

makemigrations
migrate

以上兩行代碼執行成功后,在python中的databases中連接數據庫,即可看到連接的庫中創建的表格,再在數據庫中添加數據就行

 

在項目文件夾下創建一個statics文件夾,該文件負責存儲靜態文件,將下載好的bootstrap文件和jquery-3.4.1文件傳入其中,為之后的html文件引用用

 

 在templates文件中創建一個show_books.html文件:

{% load static %}#引入靜態文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href=" {% static 'bootstrap/css/bootstrap.min.css' %}">
</head>
<body>

<div class="container-fluid"></div>
<h1>查看書籍</h1>
<div class="row">

    <div class="col-md-8 col-md-offset-2">
    <div><a href="{% url 'add_book' %}"  class="btn btn-primary">添加書籍</a></div>
        <table class=" table table-bordered table-hover table-striped">
            <thead>
            <th>編號</th>
            <th>書籍名稱</th>
            <th>價格</th>
            <th>出版日期</th>
            <th>出版社</th>
            <th>操作</th>

            </thead>
            <tbody>
            {% for books_obj in all_books_objs %}
#使用for循環來讓數據庫中的各行數據逐個調價到表格中
            <tr>
            <td>{{ forloop.counter }}</td>
            <td>{{ books_obj.name }}</td>
            <td>{{ books_obj.price }}</td>
            <td>{{ books_obj.date|date:'Y-m-d' }}</td>
#這個時間格式設置是將原本的date格式轉換為普通用戶也能看懂的格式
            <td>{{ books_obj.publisher }}</td>
            <td><a href="{% url 'edit_book' books_obj.pk %}" class="btn btn-warning">編輯</a>
{#                <a href="/del_book/{{books_obj.pk  }}" class="btn btn-danger">刪除</a>#}
                <a href="{% url 'del_book' books_obj.pk %}" class="btn btn-danger">刪除</a>
#(兩種方法實a標簽的跳轉,一個是固定格式路徑的,一個是引入靜態文件的)
            </td>
            </tr>
            {% endfor %}


            </tbody>


        </table>


    </div>
View Code

在urls和views里的配置

urls:
from app01 import views
urlpatterns = [
    url(r'^show_books/', views.show_books,name='show_books'),

views:
from django.shortcuts import render,HttpResponse,redirect
from app01 import models

def show_books(request):
    if request.method=='GET':

        all_book_objs=models.Book.objects.all()
#引入數據庫中所有數據的對象

        return render(request,'show_books.html',
                      {'all_books_objs':all_book_objs})
#將對象寫入到html文件中去

 

 

 效果圖:

 

 此時我們需要做的是點擊按鈕,做出相應的點擊事件,首先配置添加書籍按鈕

點擊添加書籍按鈕的流程步驟:
1.點擊添加按鈕,跳轉到添加書籍信息的網址中
2.寫入相關的要添加的書籍的信息
3.點擊提交按鈕,將添加的信息寫入到數據庫中
4.再次跳轉到查看書籍的網頁當中去
5.此時查看書籍調取的是數據庫表格中的所有信息,就會將所有的信息展示出來,包括新創建的書籍信息

首先給查看書籍網頁中的添加按鈕添加一個a標簽,讓他點擊就自動跳轉到添加書籍的網頁中去

<div><a href="{% url 'add_book' %}"  class="btn btn-primary">添加書籍</a></div>#href里的大括號里的內容代表的是動態引入url網頁的意思,add_book網頁放的是同級目錄下,所以可以直接寫文件名,如果想要動態引入的話,在urls.py配置里面也必須添加上相關的
路徑名稱

 

 

跳轉到add_book網頁中,進行相關的網頁添加書籍信息配置:

{% load static %}#別名的引入
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
#這個是引入bootstrap文件,利用別名的路徑設置

</head>
<body>

<div class="container-fluid"></div>
<h1>添加書籍</h1>
<div class="row">
    <div class="col-md-8 col-md-offset-2">
#創建一個表單格式,提交的按鈕請求方式為post方法,提交后路徑跳轉名稱還是為'add_book'
        <form action="{% url 'add_book' %}" method="post" >
            {% csrf_token %}
  <div class="form-group">
    <label for="exampleInputEmail1">書籍名稱</label>
    <input type="text" class="form-control" id="exampleInputEmail1" placeholder='書籍名稱' name="name">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail2">書籍價格</label>
    <input type="text" class="form-control" id="exampleInputEmail2" placeholder='書籍價格' name="price">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail3">出版日期</label>
    <input type="date" class="form-control" id="exampleInputEmail3" name="date">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail4">出版社</label>
    <input type="text" class="form-control" id="exampleInputEmail4" placeholder='出版社' name="publisher">
  </div>

  <button type="submit" class="btn btn-success  pull-right">Submit</button>
#寫入一個button提交按鈕
</form>





    </div>



</div>





<script src="{% static 'jquery-3.4.1.js' %}"></script>
<script src="{% static 'bootstrap/js/bootstrap.min.js'%}">
#同樣引入bootstrap的js文件
</script>
</body>
</html>
View Code

在urls和views里的配置

urls:
from app01 import views
url(r'^add_book/', views.add_book,name='add_book'),



views:

def add_book(request):
    if request.method=='GET':
        return render(request,'add_book.html')

 

效果圖

設置add_book里的點擊按鈕事件點擊之后就將寫入的信息保存到數據庫中,設置按鈕點擊的請求方式為post請求方式,添加views函數的數據

from app01 import models

def add_book(request):
    if request.method=='GET':
        return render(request,'add_book.html')

    else:
#此時的否則就是當為post請求提交時,做出以下操作
        print(request.POST)
#將html文件表單里的內容逐個提取出來,並進行賦值
        # name=request.POST.get('name')
        # price=request.POST.get('price')
        # date=request.POST.get('date')
        # publisher=request.POST.get('publisher')

#第二種方法,獲得html表單里的內容,並將以字典的格式展現
        book_info_dict=request.POST.dict()
        print(book_info_dict)
#將字典中多余的鍵值對刪除掉
        del book_info_dict['csrfmiddlewaretoken']
#進行數據庫的數據創建,以字典的打散形式進行傳輸數據,同樣實現功能
        models.Book.objects.create(**book_info_dict)

#數據庫進行創建新的數據
        # models.Book.objects.create(
        #     name=name,
        #     price=price,
        #     date=date,
        #     publisher=publisher
        # )

#進行頁面跳轉
        return redirect('show_books')

(最后一步進行網頁跳轉到show_books網頁中,也可以使用return render方式的方法進行,但是如果只傳入一個網頁,那么里面的每行數據不會體現出來,只會出現一個標題欄,因為並沒有將數據庫中的全部數據全部提取出來,並進行寫入html網頁的這步操作,所以才會這樣,所以還要加上這一步;
綜上所述,直接使用redirect跳轉方式可以直接找到數據,建議使用redirect方法)

 

 

在show_books網頁中設置刪除按鈕和編輯按鈕點擊事件

 給show_books里的刪除按鈕增加a標簽的跳轉功能

<a href="{% url 'del_book' books_obj.pk %}" class="btn btn-danger">刪除</a>#跳轉的數據為del_book/后面是點擊的刪除的按鈕的id號

 

urls和views里的配置:urls:

url(r'^del_book/(\d+)', views.del_book,name='del_book'), #此時在這里配置加上數字的正則匹配符,就是獲得第幾行點擊的刪除按鈕,回來執行函數時,可以直接找到該行數據並進行刪除
 views: def del_book(request,n): #n參數代表的時傳入的是第幾行數據
    models.Book.objects.filter(pk=n).delete() #數據庫找到關於第幾行的數據,並進行刪除

return redirect('show_books')

 

 

 編輯按鈕點擊事件的內容編輯:

首先在show_books按鈕的編輯按鈕增加跳轉內容

<a href="{% url 'edit_book' books_obj.pk %}" class="btn btn-warning">編輯</a>

編寫一個edit_book.html文件

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">

</head>
<body>

<div class="container-fluid"></div>
<h1>修改書籍</h1>
<div class="row">
    <div class="col-md-8 col-md-offset-2">
        <form action="" method="post" >
            {% csrf_token %}
  <div class="form-group">
    <label for="exampleInputEmail1">書籍名稱</label>
    <input type="text" class="form-control" id="exampleInputEmail1" placeholder='書籍名稱' name="name" value="{{ res.name }}">#設置表格里的內容生成為本行的原來內容
  </div>
  <div class="form-group">
    <label for="exampleInputEmail2">書籍價格</label>
    <input type="text" class="form-control" id="exampleInputEmail2" placeholder='書籍價格' name="price" value="{{ res.price }}">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail3">出版日期</label>
    <input type="date" class="form-control" id="exampleInputEmail3" name="date" value="{{ res.date }}">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail4">出版社</label>
    <input type="text" class="form-control" id="exampleInputEmail4" placeholder='出版社' name="publisher" value="{{ res.publisher }}">
  </div>

  <button type="submit" class="btn btn-success  pull-right">Submit</button>
</form>





    </div>



</div>





<script src="{% static 'jquery-3.4.1.js' %}"></script>
<script src="{% static 'bootstrap/js/bootstrap.min.js'%}"></script>
</body>
</html>
View Code

在urls和views里的配置:

urls:

url(r'^edit_book/(\d+)', views.edit_book,name='edit_book'),


views:

def edit_book(request,n):
    if request.method=='GET':
        res=models.Book.objects.get(pk=n)
        return render(request,'edit_book.html' ,{'res':res})
    else:
        book_info_dict=request.POST.dict()
        print(book_info_dict)
        del book_info_dict['csrfmiddlewaretoken']
        models.Book.objects.filter(pk=n).update(**book_info_dict)
        return redirect('show_books')
#如果為get模式請求,則自動推送edit_book.html文件,如果為post請求,則將表單里的內容數據提取出來,找到數據庫對應的行數據進行替換,替換完成后進行跳轉到show_books網頁中去

 

 

整體流程圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM