1. 程式人生 > >Django之搭建學員管理系統

Django之搭建學員管理系統

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) REFERENCES
class(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之搭建學員管理系統