1. 程式人生 > >9.5Django操作數據庫的增刪改查

9.5Django操作數據庫的增刪改查

自己 學院 and form back 選項 nag 字段 bsp

2018-9-5 18:10:52

先貼上筆記

day61 2018-04-28

1. 內容回顧

    1. HTTP協議消息的格式:
        1. 請求(request)
            請求方法 路徑 HTTP/1.1\r\n
            k1:v1\r\n
            ...\r\n
            \r\n
            請求體        <-- 可以有,可以沒有
        
        2. 響應(response)
            HTTP/1.1 狀態碼 狀態描述符\r\n
            k1:v1\r\n
            Content
-Type: text/html; charset=utf8\r\n \r\n 響應正文 <-- HTML內容 2. Python web框架的本質: a. 收發socket消息 --> 按照HTTP協議消息格式去解析消息 b. 路徑和要執行的函數的對應關系 --> 主要的業務邏輯 c. 字符串替換 --> 模板(特殊符號 --> 數據)
3. 一個完整得請求流程: 0. 啟動服務端,等待客戶端(用戶的瀏覽器)來連接 1. 在瀏覽器地址欄輸入URL,與服務端建立連接,瀏覽器發送請求 2. 服務端收到請求消息,解析請求消息,根據路徑和函數的對應關系,找到將要執行的函數 3. 執行函數,打開HTML文件,進行字符串替換,得到一個最終要返回的HTML內容 4. 按照HTTP協議的消息格式要求,把HTML內容回復給用戶瀏覽器(發送響應) 5. 瀏覽器收到響應的消息之後,按照HTML的規則渲染頁面. 6. 關閉連接
2. Django昨日內容梳理: 0. Django安裝 pip3 install django==1.11.11 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ django==1.11.11 PyCharm安裝的時候: 註意不要勾選那個選項 (你們懂得) 1. Django項目的啟動: 1. 命令行啟動 在項目的根目錄下(也就是有manage.py的那個目錄),運行: python3 manage.py runserver IP:端口--> 在指定的IP和端口啟動 python3 manage.py runserver 端口 --> 在指定的端口啟動 python3 manage.py runserver --> 默認在本機的8000端口啟動 2. PyCharm啟動 點綠色的小三角,直接可以啟動Django項目(前提是小三角左邊是你的Django項目名) 2. 配置相關 項目名/settings.py文件 1. Templates(存放HTML文件的配置) <-- 告訴Django去哪兒找我的HTML文件 2. 靜態文件(css/js/圖片) # 靜態文件保存目錄的別名 STATIC_URL = /static/ # 所有靜態文件(css/js/圖片)都放在我下面你配置的文件夾中 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), ] 3. 註釋掉setting.py中 帶有 csrf 的那一行(大概45~47行) 3. 今日內容 1. 登錄的完整示例 復習: form表單往後端提交數據需要註意哪三點: 五一回來默寫 <-- 誰寫錯成from誰就請大家吃雪糕 1. form不是from,所有獲取用戶輸入的標簽都應該放在form裏面, 並且必須要有name屬性 2. action屬性控制往哪兒提交,method一般都設置成post 3. 提交按鈕必須是type=submit,不能是別的類型 2. GET請求和POST請求 GET請求: 1. 瀏覽器請求一個頁面 2. 搜索引擎檢索關鍵字的時候 POST請求: 1. 瀏覽器向服務端提交數據,比如登錄/註冊等 3. Django中的APP: 什麽是APP?以及為什麽要用APP? project --> 項目 (老男孩教育大學校) APP --> 應用 (Linux學院/Python學院/大數據學院/Java學院) 方便我們在一個大的Django項目中,管理實現不同的業務功能. 1. 創建APP的命令 1. 命令行,在Django項目的根目錄輸入: python3 manage.py startapp app名字 4. ORM import pymysql pymysql.connect( ... ... ) 1. 不同的程序員寫的SQL水平參差不齊 2. 執行效率也參差不齊 python語法 --自動翻譯--> SQL語句 jQuery DOM $("#d1") --自動翻譯--> document.getElementById("d1") ORM: 優點: 1. 簡單,不用自己寫SQL語句 2. 開發效率高 缺點: 1. 記憶你這個特殊的語法 2. 相對於大神些的SQL語句,肯定執行效率有差距 ORM的對應關系: 類 ---> 數據表 對象 ---> 數據行 屬性 ---> 字段 ORM能做的事兒: 1. 操作數據表 --> 創建表/刪除表/修改表 操作models.py裏面的類 2. 操作數據行 --> 數據的增刪改查 不能創建數據庫,自己動手創建數據庫 使用Django的ORM詳細步驟: 1. 自己動手創建數據庫 create database 數據庫名; 2. 在Django項目中設置連接數據庫的相關配置(告訴Django連接哪一個數據庫) # 數據庫相關的配置 DATABASES = { default: { ENGINE: django.db.backends.mysql, # 連接的數據庫類型 HOST: 127.0.0.1, # 連接數據庫的地址 PORT: 3306, # 端口 NAME: "day61", # 數據庫名稱 USER: root, # 用戶 PASSWORD: 123456 # 密碼 } } 3. 告訴Django用pymysql代替默認的MySQLDB 連接MySQL數據庫 在項目/__init__.py文件中,寫下面兩句: import pymysql # 告訴Django用pymysql來代替默認的MySQLdb pymysql.install_as_MySQLdb() 4. 在app下面的models.py文件中定義一個類,這個類必須繼承models.Model class 類名(models.Model): ... 5. 執行兩個命令 1. python3 manage.py makemigrations 2. python3 manage.py migrate ORM單表的增加和查詢: 1. 查詢 models.UserInfo.objects.all()  #這個是一個對象 2. 增加 models.UserInfo.objects.create(name="張三")      
     3.刪除
       models.UserInfo.objects.filter(id=nid).delete()
     4 修改
       models.UserInfo.objects.filter(id=nid).update(name=username)

使用Django實現數據庫的增刪改查

from django.shortcuts import render, redirect, HttpResponse
from app01 import models


# 專門用來放函數
# 2018-9-4 21:32:46 睡覺去!!啦啦啦明天繼續!
def login(request):
    # 如果你是POST請求
    if request.method == "POST":  # 這裏必須是大寫
        # 如果你是POST請求,我就取出提交的數據,做登入判斷
        # 獲取用戶提交數據
        email = request.POST.get("email", None)
        pwd = request.POST.get("pwd", None)
        print(email, pwd)
        # 做是否登入成功的判斷
        if email == "[email protected]" and pwd == "1":
            # 登入成功
            # redirect 回復一個特殊的響應,這個響應會讓用戶的瀏覽器請求指定的URL
            return redirect("http://www.baidu.com")
        else:
            # 登入失敗
            error_msg = "郵箱或密碼錯誤"
            # render完成html頁面的字符串替換
            return render(request, "login.html", {"error": error_msg})
    # 不是POST請求就走下面這一句
    return render(request, "login.html")


# 2018-9-5 16:09:55
# 展示所有用戶的函數
def user_list(request):
    # 去數據庫中查詢所有的用用戶
    # 利用ORM這個工具去查詢數據庫,不用自己去查詢
    ret = models.UserInfo.objects.all()
    print(ret[0].id, ret[0].name)
    # 打開user_html文件
    return render(request, "user_list.html", {"user_list": ret})
    # return HttpResponse("別鬧了!")


# 添加用用戶的函數
def add_user(request):
    if request.method == "POST":
        # 用戶填寫了新的用戶名,並發送了POST請求
        new_name = request.POST.get("username", None)
        # 去數據庫中新創建一條用戶記錄
        models.UserInfo.objects.create(name=new_name)
        # 添加成功後直接跳轉到用戶列表頁
        return redirect("/user_list/")
    # 第一個請求頁面的時候,就返回一個頁面,頁面上有兩個框讓用戶填寫
    return render(request, "add_user.html")


# 修改用戶的函數
def edit_user(request):
    if request.method == "GET":
        # 找到用戶的ID
        nid = request.GET.get("nid")
        # 根據id找到用戶的名字  這找到的是對象
        result = models.UserInfo.objects.get(id=nid)
        # result.name   result.id
        return render(request, edit_user.html, {result: result})
    else:
        nid = request.GET.get(nid)
        username = request.POST.get(username)
        models.UserInfo.objects.filter(id=nid).update(name=username)
        return redirect("/user_list/")


# 刪除用戶的函數
def del_user(request):
    # 在頁面提交時候有nid
    nid = request.GET.get("nid")
    # 根據id刪除user
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect("/user_list/")

user_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用戶列表頁</title>
</head>
<body>

<a href="/add_user/">添加用戶</a>

<table border="1">
    <thead>
    <tr>
        <th>id值</th>
        <th>用戶名</th>
    </tr>
    </thead>
    <tbody>

    {% for user in user_list %}
        <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
{#        提交的時候,加上nid 方便修改時候找到ID    #}
<td><a href="/edit_user/?nid={{ user.id }}">編輯</a></td> {# 提交的時候,加上nid 方便刪除時候找到ID #} <td><a href="/del_user/?nid={{ user.id }}">刪除</a></td> </tr> {% endfor %} </tbody> </table> </body> </html>

add_user.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加用戶</title>
</head>
<body>

<form action="/add_user/" method="post">
    <p>用戶名:
        <input type="text" name="username">
    </p>
    
    <p>
        <input type="submit" value="提交">
    </p>
</form>

</body>
</html>

edit_user.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>編輯用戶</title>
</head>
<body>

<form action="/edit_user/?nid={{ result.id }}" method="post" >
    <p>用戶名:
        <input type="text" name="username" value="{{ result.name}}">
    </p>

    <p>
        <input type="submit" value="提交">
    </p>
</form>

</body>
</html>

9.5Django操作數據庫的增刪改查