基礎配置:
新創一個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>
在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>
在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>
在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網頁中去
整體流程圖: