Django學習小記3-學員管理數據庫①

建立一個數據庫要先想好各個表的對應關係:一對1、一對多、多對多;html

表結構:班級、學生、老師python

 

 基於這個關係,建立了以下數據庫:mysql

 

1.展現數據: 

先對班級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

最終這樣,實現數據庫數據及時展示:

 

 這樣不算完,咱們還有一個添加數據的需求:

2.添加數據:

就是在展現界面,添加一個<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/')

3. 刪除數據

假設要刪除一行數據,是否是須要把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是一次請求一次響應。

4.編輯數據

這個時候咱們發現光有刪除是不夠的,還須要一個編輯,修改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中取。

這樣就完成數據庫的增刪改查操做!

 

原創文章!轉載請在明顯處註明出處及連接,多謝合做~

相關文章
相關標籤/搜索