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

基礎配置:

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

在setting裏進行基礎配置css

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__文件中設置html

import pymysql
pymysql.install_as_MySQLdb()

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

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文件引用用mysql

 

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

{% 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裏的配置sql

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文件中去

 

 

 效果圖:數據庫

 

 此時咱們須要作的是點擊按鈕,作出相應的點擊事件,首先配置添加書籍按鈕django

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

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

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

 

 

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

{% 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網頁中去

 

 

總體流程圖:

相關文章
相關標籤/搜索