# 第一節:表單概述
# 表單:
## HTML中的表單:
單純從前端的`html`來說,表單是用來提交數據給服務器的,不管后臺的服務器用的是`Django`還是`PHP`語言還是其他語言。只要把`input`標簽放在`form`標簽中,然后再添加一個提交按鈕,那么以后點擊提交按鈕,就可以將`input`標簽中對應的值提交給服務器了。
## Django中的表單:
`Django`中的表單豐富了傳統的`HTML`語言中的表單。在`Django`中的表單,主要做以下兩件事:
1. 渲染表單模板。
2. 表單驗證數據是否合法。
## Django中表單使用流程:
在講解`Django`表單的具體每部分的細節之前。我們首先先來看下整體的使用流程。這里以一個做一個留言板為例。首先我們在后臺服務器定義一個表單類,繼承自`django.forms.Form`。示例代碼如下:
```
<pre class="calibre12">```
<span class="hljs-title"># forms.py</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MessageBoardForm</span><span class="hljs-params">(forms.Form)</span>:</span>
title = forms.CharField(max_length=<span class="hljs-params">3</span>,label=<span class="hljs-string">'標題'</span>,min_length=<span class="hljs-params">2</span>,error_messages={<span class="hljs-string">"min_length"</span>:<span class="hljs-string">'標題字符段不符合要求!'</span>})
content = forms.CharField(widget=forms.Textarea,label=<span class="hljs-string">'內容'</span>)
email = forms.EmailField(label=<span class="hljs-string">'郵箱'</span>)
reply = forms.BooleanField(required=<span class="hljs-keyword">False</span>,label=<span class="hljs-string">'回復'</span>)
```
```
然后在視圖中,根據是`GET`還是`POST`請求來做相應的操作。如果是`GET`請求,那么返回一個空的表單,如果是`POST`請求,那么將提交上來的數據進行校驗。示例代碼如下:
```
<pre class="calibre12">```
<span class="hljs-title"># views.py</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IndexView</span><span class="hljs-params">(View)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get</span><span class="hljs-params">(self,request)</span>:</span>
form = MessageBoardForm()
<span class="hljs-keyword">return</span> render(request,<span class="hljs-string">'index.html'</span>,{<span class="hljs-string">'form'</span>:form})
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">post</span><span class="hljs-params">(self,request)</span>:</span>
form = MessageBoardForm(request.POST)
<span class="hljs-keyword">if</span> form.is_valid():
title = form.cleaned_data.get(<span class="hljs-string">'title'</span>)
content = form.cleaned_data.get(<span class="hljs-string">'content'</span>)
email = form.cleaned_data.get(<span class="hljs-string">'email'</span>)
reply = form.cleaned_data.get(<span class="hljs-string">'reply'</span>)
<span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">'success'</span>)
<span class="hljs-keyword">else</span>:
print(form.errors)
<span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">'fail'</span>)
```
```
在使用`GET`請求的時候,我們傳了一個`form`給模板,那么以后模板就可以使用`form`來生成一個表單的`html`代碼。在使用`POST`請求的時候,我們根據前端上傳上來的數據,構建一個新的表單,這個表單是用來驗證數據是否合法的,如果數據都驗證通過了,那么我們可以通過`cleaned_data`來獲取相應的數據。在模板中渲染表單的`HTML`代碼如下:
```
<pre class="calibre12">```
<span class="hljs-tag"><<span class="hljs-class">form</span> <span class="hljs-class">action</span>=<span class="hljs-string">""</span> <span class="hljs-class">method</span>=<span class="hljs-string">"post"</span>></span>
<span class="hljs-tag"><<span class="hljs-class">table</span>></span>
<span class="hljs-tag"><<span class="hljs-class">tr</span>></span>
<span class="hljs-tag"><<span class="hljs-class">td</span>></span><span class="hljs-tag"></<span class="hljs-class">td</span>></span>
<span class="hljs-tag"><<span class="hljs-class">td</span>></span><span class="hljs-tag"><<span class="hljs-class">input</span> <span class="hljs-class">type</span>=<span class="hljs-string">"submit"</span> <span class="hljs-class">value</span>=<span class="hljs-string">"提交"</span>></span><span class="hljs-tag"></<span class="hljs-class">td</span>></span>
<span class="hljs-tag"></<span class="hljs-class">tr</span>></span>
<span class="hljs-tag"></<span class="hljs-class">table</span>></span>
<span class="hljs-tag"></<span class="hljs-class">form</span>></span>
```
```
我們在最外面給了一個`form`標簽,然后在里面使用了`table`標簽來進行美化,在使用`form`對象渲染的時候,使用的是`table`的方式,當然還可以使用`ul`的方式(`as_ul`),也可以使用`p`標簽的方式(`as_p`),并且在后面我們還加上了一個提交按鈕。這樣就可以生成一個表單了
- Introduction
- 第一章:學前準備
- 第一節:虛擬環境
- 第二節:準備工作
- 第三節:Django介紹
- 第四節:URL組成部分
- 第二章:URL與視圖
- 第一節:第一個Django項目
- 第二節:視圖與URL分發器
- 第三章:模板
- 第一節:模板介紹
- 第二節:模板變量
- 第三節:常用標簽
- 第四節:常用過濾器
- 第五節:自定義過濾器
- 第七節:模版結構優化
- 第八節:加載靜態文件
- 第四章:數據庫
- 第一節:MySQL相關軟件
- 第二節:數據庫操作
- 第三節:ORM模型
- 第四節:模型常用字段
- 第五節:外鍵和表關系
- 第六節:增刪改查操作
- 第七節:查詢操作
- 第八節:QuerySet API
- 第九節:ORM模型遷移
- 第十節:ORM作業
- 第十一節:ORM作業參考答案
- 第十二節:Pycharm連接數據庫
- 第五章:視圖高級
- 第一節:限制請求method
- 第二節:頁面重定向
- 第三節:HttpRequest對象
- 第四節:HttpResponse對象
- 第五節:生成CSV文件
- 第六節:類視圖
- 第七節:錯誤處理
- 第六章:表單
- 第一節:表單概述
- 第二節:用表單驗證數據
- 第三節:ModelForm
- 第四節:文件上傳
- 第七章:cookie和session
- 第八章:上下文處理器和中間件
- 第一節:上下文處理器
- 第二節:中間件
- 第九章:安全
- 第一節:CSRF攻擊
- 第二節:XSS攻擊
- 第三節:點擊劫持攻擊
- 第四節:SQL注入
- 第十章:信號
- 第一節:什么是信號
- 第十一章:驗證和授權
- 第一節:概述
- 第二節:用戶對象
- 第三節:權限和分組
- 第十二章:Admin系統
- 第十三章:Django的緩存
- 第十四章:memcached
- 第十五章:Redis