前言 |
- 目標:實現Django通過表單的GET方式和POST方式提交數據,並添加到數據庫 。
- OS:win10 x64
- Django:1.11.8
- Python: 3.6
- 本文完整示例:完整示例;
雖然使用的系統和軟件沒有什么影響,但還是交代一下。
二、實現思路 |
-
從用戶角度考慮
- 訪問一個url,返回填寫表單頁面;
- 在表單頁面填寫信息,並提交;
- 若提交成功,返回提交成功頁面,並提供返回添加頁面和圖書列表跳轉鏈接;
- 若提交失敗,則返回操作失敗頁面,並提供跳轉繼續添加鏈接;
-
從開發者角度
- 用戶請求一個url,傳遞一個頁面給用戶;
- 用戶填寫數據后提交,這時需要判斷字段是否合法,合法則允許提交;不合法則提示哪一項不合法,提示用戶修改;
- 用戶提交成功后,修改數據庫;若修改數據庫等操作成功,則傳遞成功頁面;否則,返回失敗頁面;
- 繼續等待用戶其他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"> <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"> <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方法實現地址動態拼接自動生成超鏈接地址
顯示效果如下:
可以看到,圖書“水滸傳已經添加成功”。
四、總結 |
- 本文完整示例:完整示例;
- 能力有限,歡迎指錯。
注意:
- 這里並沒有實現頁面的安全檢測,可自行通過JS或JQuery實現;
- 在接收數據時,由於GET和POST方法取值不同,需要對GET和POST方法進行判定;
- 為了防止惡意SQL注入,對用戶輸入的內容字段也應該進行檢測。