django開發系列:表單之Form使用
Django中的表單
Django中的表單豐富了傳統的HTML語言中的表單。在Django中的表單,主要做以下兩件事:
- 渲染表單模板。(不常用,容易前後端耦合)
- 表單驗證數據是否合法。
Django中表單使用流程
在一個app中新建一個forms.py,定義一個表單類,繼承自django.forms.Form。
Field字段名稱
在html中對應的是<input type="text" name="field_name" >
中input標籤的name屬性
比如title字段在html中就是<input type="text" name="title">
from django import forms
class MesssageBoardForm(forms.Form):
title = forms.CharField(max_length=100,min_length=2,label='標題',error_messages={"min_length":"最少不能少於1個字符!"})
content = forms.CharField(widget=forms.Textarea,label='內容',error_messages={"required":"必須要傳content字段!"})
email = forms.EmailField(label='郵箱',error_messages={"required":'必須要傳email字段!'})
reply = forms.BooleanField(required=False,label='是否回覆')
在視圖中,根據是GET
還是POST
請求來做相應的操作。如果是GET請求,那麼返回一個空的表單,如果是POST請求,那麼將提交上來的數據進行校驗。
from django.shortcuts import render
from django.views.generic import View
from .forms import MesssageBoardForm
from django.http import HttpResponse
from django.forms.utils import ErrorDict
class IndexView(View):
def get(self,request):
form = MesssageBoardForm()
return render(request,'index.html',context={"form":form})
def post(self,request):
form = MesssageBoardForm(request.POST)
if form.is_valid():
title = form.cleaned_data.get('title')
content = form.cleaned_data.get('content')
email = form.cleaned_data.get('email')
reply = form.cleaned_data.get('reply')
print('='*30)
print(title)
print(content)
print(email)
print(reply)
print('='*30)
return HttpResponse('success')
else:
print(form.errors.get_json_data())
return HttpResponse('fail')
在使用GET
請求的時候,我們傳了一個form給模板,那麼以後模板就可以使用form來生成一個表單的html代碼。在使用POST
請求的時候,我們根據前端上傳上來的數據,構建一個新的表單,這個表單是用來驗證數據是否合法的,如果數據驗證
通過了,那麼我們可以通過cleaned_data
來獲取相應的數據。在模板中渲染表單的HTML代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
<table>
{{ form.as_table }}
<tr>
<td></td>
<td><input type="submit" name="提交" ></td>
</tr>
</table>
</form>
</body>
</html>
我們在最外面給了一個form標籤
,然後在裏面使用了table標籤
來進行美化,在使用form對象渲染的時候,使用的是table的方式,當然還可以使用ul的方式(as_ul
),也可以使用p標籤的方式(as_p
),並且在後面我們還加上了一個提交按鈕
。這樣就可以生成一個表單了
下面是表單類.errors.get_json_data()
方法返回的值
{'title': [{'message': 'Ensure this value has at least 5 characters (it has 4).', 'code': 'min_length'}], 'content': [{'message': 'This field is required.', 'code': 'required'}], 'email': [{'message': 'This field is required.', 'code': 'required'}]
在表單類(這裏是FormTable)中給各個字段添加errors_message添加鍵值對後可修改錯誤提示,修改後的表單類.errors.get_json_data()
方法返回值如下:
{'title': [{'message': '字符至少5個,至多100個', 'code': 'min_length'}], 'content': [{'message': '要有content內容', 'code': 'required'}], 'email': [{'message': '必須是郵箱格式', 'code': 'required'}]}