前言
通常我們需要在html頁面上輸入框里面輸入數據,比如登錄的時候,輸入賬號和密碼,點提交按鈕。
從html把數據提交到服務端,服務端接收數據后判斷提交的數據,然后做出對應的響應,這么一整個流程就是表單相關的知識點,涉及到數據的交互。
form表單
表單在html中由<form>
標簽實現,一個完整的表單包含四個部分:提交地址、請求方式、元素控件、提交按鈕,簡單的html表單如下
- action 提交地址,設置用戶提交的數據由哪個url接收和處理
- method 請求方式,get或post請求
- input 元素控件, 輸入文本信息
- submit 提交按鈕,觸發提交動作
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>測試你的QQ號</title>
</head>
<body>
<p>請輸入你的QQ號</p>
<form action="/result" method="get">
qq: <input type="text" name="q"> <br>
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
get請求提交
把上面的html報錯為get_demo.html,放到templates目錄下,views.py寫個訪問
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
# 測試QQ號訪問頁面
def test_qq(request):
return render(request, 'get_demo.html')
# 提交后返回頁面
def result_qq(request):
return HttpResponse("提交成功!")
urls.py訪問地址
from django.conf.urls import url
from django.urls import re_path, path
from hello import views
urlpatterns = [
url(r'^qq/', views.test_qq),
url(r'^result/', views.result_qq),
]
在瀏覽器輸入http://localhost:8002/qq/,打開頁面如下
輸入QQ號點擊提交,頁面顯示:提交成功!
獲取提交參數(request.GET)
html上的數據提交后,我們希望能獲取到提交的數據,然后對數據做個簡單的處理,跟進不同的數據返回不同的結果。
我這里寫個簡單的案例,接收到用戶提交的QQ號,對QQ號做個簡單判斷,奇數返回“大吉大利”,偶數返回“恭喜發財”
# views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def test_qq(request):
'''請求頁面'''
return render(request, 'get_demo.html')
def result_qq(request):
'''返回結果'''
if request.method == 'GET':
# 獲取提交的數據
r = request.GET["q"] # key就是前面輸入框里的name屬性對應值name="q"
res = ""
try:
if int(r) %2:
res = "大吉大利!"
else:
res = "恭喜發財!"
except:
res = "請輸入正確QQ號!"
return HttpResponse("測試結果:%s"%res)
else:
render(request, 'get_demo.html')
request.GET 可以看成一個字典,用GET方法傳遞的值都會保存到其中,可以用 request.GET['key_name']來取值,但是當key值不存在時,會報錯“MultiValueDictKeyError”。
為了避免key值不存在時報錯,這里可以用另外一種寫法:request.GET.get('key_name', None)
# 獲取提交的數據
# r = request.GET["q"] # key_name就是前面輸入框里的name屬性對應值name="q"
r = request.GET.get('q', None) #key_name不存在時,不會報錯
查詢數據庫返回
通常查詢涉及到查詢數據庫,與數據庫會有數據交互,接着前面的User庫,通過輸入用戶名,查詢到對應的emali地址,參考https://www.cnblogs.com/yoyoketang/p/10335212.html
實現功能:通過輸入用戶名稱name值,查詢到對應的email地址,測試數據如下
templates/name.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>查詢mail</title>
</head>
<body>
<form action="" method="get">
輸入用戶名: <input type="text" name="name"> <br>
<br>
<input type="submit" value="提交">
</form>
<p>查詢結果:{{email}} </p>
</body>
</html>
action=""表示返回頁面就是當前頁面,這里視圖函數寫一個即可
# views.py
from django.shortcuts import render
from django.http import HttpResponse
from hello.models import User
# Create your views here.
def user(request):
'''請求頁面-返回結果'''
res = ""
if request.method == 'GET':
# 獲取提交的數據
# r = request.GET["q"] # key就是前面輸入框里的name屬性對應值name="q"
n = request.GET.get('name', None) # key不存在時不會報錯
res = User.objects.filter(user_name="%s" % n)
try:
res = res[0].mail
except:
res = "未查詢到數據"
return render(request, 'name.html', {'email': res})
else:
return render(request, 'name.html', {'email': res})
訪問地址和返回地址
# urls.py
from django.conf.urls import url
from hello import views
urlpatterns = [
# 新增用戶
url(r'^email/', views.user),
]
html顯示效果如下