Django之搭建學員管理系統
阿新 • • 發佈:2018-01-14
hide where .cn foreign get none red table val
GET請求傳參數的方式: /xxx/?k1=v1&k2=v2 ? 前面的是URL ?後面的是請求的參數 多個參數之間用&分隔 POST請求傳數據: 是放在請求體裏面的
表結構設計.
-- 創建班級表 CREATE TABLE class( id int auto_increment PRIMARY KEY, name CHAR(10) not null )engine=innodb DEFAULT charset=utf8; -- 創建學生表 CREATE TABLE student( id int auto_increment PRIMARY KEY, name CHAR(結構10) not null, class_id INT, FOREIGN KEY (class_id) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE )engine=innodb DEFAULT charset=utf8; -- 創建老師表 CREATE TABLE teacher( id int auto_increment PRIMARY KEY, name CHAR(10) not null )engine=innodb DEFAULT charset=utf8; -- 創建老師和班級關系表 CREATE TABLE teacher2class( id INT AUTO_INCREMENT PRIMARY KEY, teacher_id INT,FOREIGN KEY (teacher_id) REFERENCES teacher(id) ON DELETE CASCADE ON UPDATE CASCADE , class_id INT,FOREIGN KEY (class_id) REFERENCESclass(id) ON DELETE CASCADE ON UPDATE CASCADE )engine=innodb DEFAULT charset=utf8; 表結構設計
視圖函數+模板語言+pymysql
視圖函數:
我們把所有的處理請求相關的函數從 urls.py中拿出來,統一放在一個叫views.py的文件中,這樣就把代碼模塊化,實現不同功能的代碼放在不同的模塊。
urls.py文件中只放置 URL和函數的對應關系
views.py 文件中只放置那些針對不同URL執行的函數
註意:
這個時候就需要在urls.py中導入views.py文件(views前面加.表明從當前目錄下導入)
from .views import index, login, class_list, delete_class, add_class, edit_class
展示所有的班級列表
# 展示所有的班級列表 def class_list(request): # 這個函數是展示所有的班級列表 # 1. 去數據庫裏取數據 # 連接數據庫 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 指定pymysql查詢出的每條數據的類型是字典類型({"字段名": "值"}) ***** cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 寫好查詢的SQL語句 sql = "select id, cname from class order by id;" # 執行上面定義好的SQL語句 cursor.execute(sql) # 拿到所有查詢到的結果 # 此處查詢結果是一個大列表,裏面是一個一個字典 ret = cursor.fetchall() # 關閉連接 cursor.close() conn.close() # 2. 用數據去替換HTML頁面中的特殊符號,特殊符號是按照Django模板語言的語法寫好的 # render()的第三個參數是一個字典,字典的key是什麽,HTML文件中的變量名就寫什麽 return render(request, "class_list.html", {"class_list": ret})函數
頁面部分:
這裏用到了Django模板語言的for循環
<!-- Table --> <div class="my-table-wrapper"> <table class="table table-bordered table-striped"> <thead> <tr> <th>#</th> <th>班級ID</th> <th>班級名稱</th> <th>操作</th> </tr> </thead> <tbody> {% for class in class_list %} <tr> <td>{{ forloop.counter }}</td> <td scope="row">{{ class.id }}</td> <td>{{ class.cname }}</td> <td class="text-center"> <a href="/edit_class/?class_id={{ class.id }}" type="button" class="btn btn-sm btn-info" aria-label="Left Align"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>新頁面編輯 </a> <a type="button" class="btn btn-sm btn-success" aria-label="Left Align"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>編輯 </a> <a href="/delete_class/?class_id={{ class.id }}" type="button" class="btn btn-sm btn-danger" aria-label="Left Align"> <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>刪除 </a> </td> </tr> {% endfor %} </tbody> </table>頁面
刪除班級
# 刪除班級 def delete_class(request): # 根據班級的ID刪除 # 班級ID從哪兒來? --> 需要頁面發起請求的時候攜帶 # 頁面如何攜帶要刪除的班級的ID? --> 通過給a標簽設置href屬性時拼接 # 後端拿到要刪除的班級的ID class_id = request.GET.get("class_id") # 去數據庫裏刪除 # 連接數據庫 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 指定輸出的每條數據的類型是字典 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 刪除操作的SQL語句 sql = "delete from class where id=%s;" # 執行刪除語句 cursor.execute(sql, class_id) # 向數據庫提交操作 conn.commit() cursor.close() conn.close() # 執行完刪除操作後跳轉回班級列表頁面 return redirect("/class_list/")刪除的邏輯
頁面部分:
瀏覽器發起的GET請求通過在URL後面添加/url/?k1=v1&k2=v2的方式添加參數。
使用Django模板語言的語法將{{ class.id }}拼接到了a標簽的href屬性中。
這樣頁面點擊這個a標簽就能把要刪除的班級ID值傳遞給後端了。
<a href="/delete_class/?class_id={{ class.id }}" type="button" class="btn btn-sm btn-danger" aria-label="Left Align"> <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>刪除 </a>頁面
添加班級
# 添加班級 def add_class(request): # 如果是POST請求,就表明是頁面要提交數據 if request.method == "POST": # 頁面使用POST方法提交添加班級的數據 # 後端取到新班級的名稱信息 class_name = request.POST.get("cname") conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 指定輸出的結果類型是字典 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 新增班級的SQL語句 sql = "insert into class (cname) VALUE (%s);" # 執行SQL語句,在數據庫中創建一條新的班級記錄 cursor.execute(sql, class_name) # 向數據庫提交 conn.commit() # 關閉連接 cursor.close() conn.close() # 新添加一個班級之後跳轉到班級列表頁面 return redirect("/class_list/") # 如果不是POST請求就返回添加班級頁面 return render(request, "add_class.html")添加的邏輯
頁面部分:
利用form表單向後端提交新班級的數據,所以add_class.html頁面中form表單要填寫上action="/add_class/” 和 method=“post”
<form action="/add_class/" method="post"> <input type="text" name="cname"> <input type="submit" value="提交"> </form>頁面
編輯班級信息
# 新頁面編輯班級信息 def edit_class(request): # 如果是POST請求 if request.method == "POST": # 從頁面POST過來的數據中取到編輯的班級ID class_id = request.POST.get("id") # 從頁面POST過來的數據中取到班級名稱 class_cname = request.POST.get("cname") # 去數據庫裏面更新班級名稱 # 連接數據庫 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 獲取光標 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 更新班級信息的SQL語句 sql = "update class set cname=%s where id=%s;" # 執行SQL語句 cursor.execute(sql,(class_cname, class_id)) # 向數據庫提交修改 conn.commit() # 關閉連接 cursor.close() conn.close() # 更新完班級信息之後跳轉回班級列表頁面 return redirect("/class_list/") # 如果不是POST請求,就表明是點擊了新頁面編輯班級信息的按鈕 # 取到被編輯的班級的ID class_id = request.GET.get("class_id") # 去數據庫裏查詢當前班級的信息 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 指定輸出的單條數據的類型是字典 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 查詢的SQL語句 sql = "select id, cname from class WHERE id=%s;" # 執行查詢操作 cursor.execute(sql, class_id) # 取單條數據 ret = cursor.fetchone() # 關閉連接 cursor.close() conn.close() # 把要編輯的班級的信息 替換 edit_class.html 頁面中的特殊符號,最後把頁面返回給瀏覽器 return render(request, "edit_class.html", {"class_info": ret})編輯的邏輯
頁面部分:
編輯班級信息在頁面上展示的就是一個form表單,用戶更新完班級信息之後要提交,就需要向後端提交表單數據。
這個時候form表單就需要配置好 action="/edit_class/" 和 method="post"。
但是提交的數據裏需要告知後端,我更改的是數據庫中的哪一條班級信息,所以這裏要把班級ID也放到form表單中。
班級ID不應該讓用戶修改,所以就把班級ID的input框給隱藏掉。
<form action="/edit_class/" method="post"> <input type="text" name="id" value="{{ class_info.id }}" style="display: none"> <input type="text" name="cname" value="{{ class_info.cname }}"> <input type="submit" value="提交"> </form>HTML
Django之搭建學員管理系統