建立一個數據庫要先想好各個表的對應關係:一對1、一對多、多對多;html
表結構:班級、學生、老師python
基於這個關係,建立了以下數據庫:mysql
先對班級class進行操做試一下:sql
之前咱們寫的程序都放在urls.py文件裏,顯得複雜而不夠專業!因此咱們能夠新建一個目錄好比叫 /app01/,再新建一個views.py(路徑會自動添加,注意覈對好)數據庫
這樣之後就能夠在 urls.py寫:django
from app01 import views
...
urlpatterns = [
#path('admin/', admin.site.urls),
path('classes',views.classes)
]
那是否是咱們就須要在 views.py 裏定義一個classes的函數:服務器
#!/usr/bin/env python # -*- coding:utf-8 -*- from django.shortcuts import render #展現班級 def classes(request): import pymysql conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123!@123', db='oldboys',charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #建立遊標 cursor.execute("select id,title from class") #執行SQL class_list = cursor.fetchall() cursor.close() #關閉遊標 conn.close() #關閉鏈接 return render(request,'classes.html',{'class_list':class_list})
真情連接:更多數據庫操做請看武sir-Python開發【第十九篇】:Python操做MySQL | python開發【第一篇】app
那上面就實現了鏈接數據庫取得數據的操做,那如何展示出來呢?就是建立一個return的那個 class.html 文件:函數
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>班級</title> </head> <body> <h1>班級列表</h1> <table> <thead> <tr> <th>ID</th> <th>班級名稱</th> </tr> </thead> <tbody> {% for row in class_list %} <tr> <td>{{ row.id }}</td> <td>{{ row.title }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
看,最終的實現流程是:Djando 經過urls.py路由對應裏找到新目錄的views.py導入的函數classes, 這個函數再渲染classes.html展現頁,包含了特殊標記。展現表單以循環實現。fetch
最終這樣,實現數據庫數據及時展示:
這樣不算完,咱們還有一個添加數據的需求:
就是在展現界面,添加一個<a>標籤,實現增長一個班級的操做。(頁面跳轉)
<body> <h1>班級列表</h1> <div> <a href="/add_class/">添加</a> </div> <table> <thead> <tr> <th>ID</th> <th>班級名稱</th> </tr> </thead> <tbody> {% for row in class_list %} <tr> <td>{{ row.id }}</td> <td>{{ row.title }}</td> </tr> {% endfor %} </tbody> </table> </body>
咱們在templates下新建一個add_class.html的簡單增長界面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加班級</title> </head> <body> <h1>增長班級</h1> <form method="POST" action="/add_class/"> <p>班級名稱:</p> <input type="text" name="title" required autofocus /><br> <input type="submit" value="提交" /> </form></body> </html>
這樣再修改路由urls
urlpatterns = [ #path('admin/', admin.site.urls), path('classes/',views.classes), path('add_class',views.add_class), ]
而後再在views.py裏建立一個add_class的函數:
... #添加班級 def add_class(request): #判斷提交方式來區分什麼操做 if request.method == "GET": return render(request,'add_class.html') else: #print(request.POST) v = request.POST.get('title') #將title值添加到數據庫 import pymysql conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='X123!@#123', db='oldboys', charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("insert into class(title) values(%s)",[v,]) conn.commit() #提交 cursor.close() conn.close() #提交完再跳轉到展現頁 return redirect('/classes/')
假設要刪除一行數據,是否是須要把ID拿到,請求發過去就是告訴服務端要刪除誰。那怎麼傳遞這個id參數呢?
用到/?nid={{row.id}}
因此改的classes,html展現頁:
<body> <h1>班級列表</h1> <div> <a href="/add_class/">添加</a> </div> <table> <thead> <tr> <th>ID</th> <th>班級名稱</th> <th>操做</th> </tr> </thead> <tbody> {% for row in class_list %} <tr> <td>{{ row.id }}</td> <td>{{ row.title }}</td> <td><a href="/del_class/?nid={{ row.id }}">刪除</a></td> </tr> {% endfor %} </tbody> </table> </body>
對應咱們要在路由urls.py再增長對應:
path('del_class/',views.del_class),
再在views.py增長del_class函數:
... #刪除班級 def del_class(request): nid = request.GET.get('nid') # 數據庫操做 import pymysql conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123!@#123', db='oldboys', charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("delete from class where id=%s", [nid, ]) conn.commit() # 提交 cursor.close() conn.close() # 提交完再跳轉到展現頁 return redirect('/classes/')
因而可知http是一次請求一次響應。
這個時候咱們發現光有刪除是不夠的,還須要一個編輯,修改class.html文件:
<tbody> {% for row in class_list %} <tr> <td>{{ row.id }}</td> <td>{{ row.title }}</td> <td> <a href="/edit_class/?nid={{ row.id }}">編輯</a> | <a href="/del_class/?nid={{ row.id }}">刪除</a> </td> </tr> {% endfor %} </tbody>
這樣有了點擊按鈕,咱們就要設置下路由urls.py
path('edit_class/',views.edit_class),
再在templates下增長一個edit_class.html
添加默認值放到表格的value中,就至關於添加原始值了;
id和titlle要一塊兒發過去,否則不知道修改誰。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>編輯班級</title> </head> <body> <h1>編輯班級</h1> <!--<form method="POST" action="/edit_class/" >>--> <form method="POST" action="/edit_class/?nid={{ result.id }}" <p>班級名稱:</p> <!--<input style="display: none" name="id" value="{{ result.id }}"/><br>>--> <input type="text" name="title" value="{{ result.title }}" autofocus /><br> <input type="submit" value="提交" /> </form> </body> </html>
而後對應到views.py寫個edit_class的函數:
... #編輯班級 def edit_class(request): if request.method == "GET": nid = request.GET.get('nid') # 數據庫操做 import pymysql conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123@#123', db='oldboys', charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("select id,title from class where id=%s", [nid, ]) result = cursor.fetchone() # 獲取原始值 cursor.close() conn.close() return render(request, 'edit_class.html', {'result': result}) else: #是POST請求時,提交新的數據到數據庫 #nid = request.POST.get('id') 這個對應隱藏標籤操做 nid = request.GET.get('nid') title = request.POST.get('title') import pymysql conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123@#123', db='oldboys', charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("update class set title=%s where id=%s", [title,nid, ]) conn.commit() cursor.close() conn.close() return redirect('/classes/')
注:值得注意的是,此時提交編輯的數據是要連帶id一塊兒提交的,由於提交操做又是一種新的請求,否則服務器不知道對應的哪一個修改。
因此帶id提交有兩種方式能夠實現:
1.POST提交表單時也寫入<input>id 只不過利用dispaly=none屬性將其隱藏用戶看不到了,但實際他就在那而後一塊兒提交給數據庫了,這個時對應的操做數據庫提取的就都是POST.get
2,也能夠不隱藏,由於能夠在url中攜帶nid,因此<form method="POST" action="/edit_class/?nid={{ result.uid }}">,而後提交數據庫nid就從GET.get取,title仍是POST.get中取。
這樣就完成數據庫的增刪改查操做!
原創文章!轉載請在明顯處註明出處及連接,多謝合做~