Django使用表單操做數據庫

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

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

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

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

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

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

  • 返回給用戶頁面bookadd.html

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

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

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

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>

顯示效果以下:
這裏寫圖片描述django

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

使用JavaScript或JQuery實現判斷,這個實現方法不少,再也不贅述。安全

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

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

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

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

# 向圖書館增長數據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方法實現地址動態拼接自動生成超連接地址

顯示效果以下:
這裏寫圖片描述

能夠看到,圖書「水滸傳已經添加成功」。

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

注意:

  1. 這裏並無實現頁面的安全檢測,可自行經過JS或JQuery實現;
  2. 在接收數據時,因爲GET和POST方法取值不一樣,須要對GET和POST方法進行斷定;
  3. 爲了防止惡意SQL注入,對用戶輸入的內容字段也應該進行檢測。
相關文章
相關標籤/搜索