1. 程式人生 > >Django使用表單操作數據庫

Django使用表單操作數據庫

思路 bgcolor javascrip win one _id 表單提交 mode 文件

前言
  1. 目標:實現Django通過表單的GET方式和POST方式提交數據,並添加到數據庫 。
  2. OS:win10 x64
  3. Django:1.11.8
  4. Python: 3.6
  5. 本文完整示例:完整示例;

雖然使用的系統和軟件沒有什麽影響,但還是交代一下。

二、實現思路
  • 從用戶角度考慮
    1. 訪問一個url,返回填寫表單頁面;
    2. 在表單頁面填寫信息,並提交;
    3. 若提交成功,返回提交成功頁面,並提供返回添加頁面和圖書列表跳轉鏈接;
    4. 若提交失敗,則返回操作失敗頁面,並提供跳轉繼續添加鏈接;
  • 從開發者角度
    1. 用戶請求一個url,傳遞一個頁面給用戶;
    2. 用戶填寫數據後提交,這時需要判斷字段是否合法,合法則允許提交;不合法則提示哪一項不合法,提示用戶修改;
    3. 用戶提交成功後,修改數據庫;若修改數據庫等操作成功,則傳遞成功頁面;否則,返回失敗頁面;
    4. 繼續等待用戶其他url請求。
三、實現步驟

接下來,將從開發者的角度實現。
假設有這樣一個場景,圖書管理員需要向數據庫中錄入書籍以及作者的信息,書籍只具有“書名“屬性,作者具有"姓名" 和 "年齡"屬性。

1. 用戶訪問url,傳遞一個頁面給用戶
  • 在urls.py文件中添加路由
urlpatterns = [
    # 以上還有很多url路由,這裏僅列出需要的路由
    ## 利用表單增加圖書,實現前臺與數據庫交互
    url(r‘^addbook/$‘, polls_views.addbook),
]

以上url匹配地址http://127.0.0.1/addbook/,當用戶訪問該地址時,返回一個頁面給用戶。

  • 返回給用戶頁面bookadd.html

在views.py文件中添加方法,返回頁面bookadd.html。

## 返回給用戶頁面bookadd.html
def addbook(request):
    return render(request, ‘bookadd.html‘)

在templates目錄下新建bookadd.html文件,添加HTML代碼。

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"> <title>增加圖書</title> <script src="../js/jquery-2.1.3.min.js"></script> <style> * { margin: 0; padding: 0; </style> </head> <body> <h2>增加圖書</h2> <h3>GET方式</h3> <form action="/addbooktodatabase/" method="get" name="addbook"> <p><span>書名:</span><input type="text" placeholder="書名" name="book_name"></p> <p><span>作者:</span><input type="text" placeholder="作者" name="author"></p> <p><span>作者年齡:</span><input type="text" placeholder="作者年齡" name="author_age"></p> <input type="reset">&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" value="增加"> </form> <h3>POST方式</h3> <form action="/addbooktodatabase/" method="post" name="addbook"> {% csrf_token %} <p><span>書名:</span><input type="text" placeholder="書名" name="book_name"></p> <p><span>作者:</span><input type="text" placeholder="作者" name="author"></p> <p><span>作者年齡:</span><input type="text" placeholder="作者年齡" name="author_age"></p> <input type="reset">&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" value="增加"> </form> </body> </html>

顯示效果如下:
技術分享圖片

  • 在用戶本地頁面判斷操作是否合法

使用JavaScript或JQuery實現判斷,這個實現方法很多,不再贅述。

  • 用戶提交成功,後臺傳遞給指定url,更新數據庫

在urls.py文件中添加url路由

urlpatterns = [
    # 以上還有很多url路由,這裏僅列出需要的路由
    ## 處理表單提交的數據,實現前臺與數據庫交互
     url(r‘^addbooktodatabase/‘, polls_views.addbooktodatabase),
]

在views.py中增加更新數據庫方法

# 向圖書館增加數據GET或POST方法方法
def addbooktodatabase(request):
    # 獲取參數book_name,author,author_age
    if request.method == "GET":
        book_name = request.GET["book_name"]
        author_name = request.GET["author"]
        author_age = request.GET["author_age"]
    else:
        book_name = request.POST["book_name"]
        author_name = request.POST["author"]
        author_age = request.POST["author_age"]

    ## 先增加作者信息
    from polls.models import Person
    person = Person()
    person.name = author_name
    person.age = author_age
    person.save()
    ## 增加圖書信息
    from polls.models import Book
    bookadded = Book(name=book_name)
    # 保存修改
    bookadded.person_id = person.id
    bookadded.save()
    # 重定向到添加成功頁面
    from django.http import HttpResponseRedirect
    return HttpResponseRedirect(‘/addok/‘)
  • 返回頁面addok/html

在urls.py文件中添加url路由

urlpatterns = [
    # 以上還有很多url路由,這裏僅列出需要的路由
    # 添加成功後返回添加成功頁面addok
    url(r‘^addok/‘, polls_views.addok),
]

在templates目錄下新建addok.html文件,添加HTML代碼。

HTML代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加成功</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        a{
            text-decoration:none;
        }
    </style>
</head>
<body>
    <div>
        <p>添加圖書成功</p>
        <p><a href="/addbook/">繼續添加</a></p>
        <p><a href="/booklist/">查看圖書列表</a></p>
    </div>
</body>
</html>

顯示效果如下:

技術分享圖片

  • 當用戶點擊“查看圖書列表”時,傳遞bookList.html頁面

bookList.html在另一篇博文中已實現,請參考:利用Django中的url方法實現地址動態拼接自動生成超鏈接地址

顯示效果如下:
技術分享圖片

可以看到,圖書“水滸傳已經添加成功”。

四、總結
  1. 本文完整示例:完整示例;
  2. 能力有限,歡迎指錯。

註意:

  1. 這裏並沒有實現頁面的安全檢測,可自行通過JS或JQuery實現;
  2. 在接收數據時,由於GET和POST方法取值不同,需要對GET和POST方法進行判定;
  3. 為了防止惡意SQL註入,對用戶輸入的內容字段也應該進行檢測。

Django使用表單操作數據庫