在本章中我們講解最後一個知識點,即基於 Model 模型類定義數據表,這種業務場景也是我們在實際的開發工作中經常遇到的,比如我們要添加一本書籍,這個頁面中的表單欄位就需要與 Book 的 Model 定義相對應。利用 Form 對象並不難實現,只需要將 Model 中定義的欄位對應成 Form 的對象中的表單欄位就可以了,但是這時候也存在一個問題,就是如果這種需要對應的 Model 較多的時候,且 Model 中定義的欄位也較多,那麼重複實現這種表單的過程就會變成機械式的重複。
1. 初識表單系統ModelFormDjango 的表單系統充分考慮到這個問題,並給開發者提供了 ModelForm,使用它就可以實現基於 Model 的定義自動生成表單,這就大大簡化了根據 Model 生成表單的過程,很好解決了我們遇到的問題,下面就讓我們一起來看一下,它是如何實現這個過程的吧。
1) 實現一個簡單的ModelForm首先,我們來實現一個簡單的 ModelForm 主要看它的使用方法以及在使用它的時候有哪些需要我們注意的事項。下面,編寫如下代碼:
class BookModelForm(forms.ModelForm): class Meta: model=Book labels={'price':'零售價格'} exclude=('retail_price')ModelForm 需要使用 Meta 來設置必要的元數據信息,這樣 Model 的元數據項不謀而合,我們在 Meta 中設置三個選項:model 指定了需要生成表單的模型對象;labels 為字典類型,用於定義表單欄位的名稱,當然這裡大家需要注意一下,表單的名稱首先默認使用 Model欄位設置的 verbose_name,但是若 Model 欄位沒有設置該欄位選項,則就可以使用 lables 設置的欄位名;exclude 標識不需要在表單中顯示的欄位,這和 Model 的 Meta 也一樣。
2. 使用ModeForm定義表單
ModelForm 的使用方法與 Form 類似,同樣也可以使用 is_valid 方法來校驗欄位值的合法性和通過 cleaned_data 屬性獲取清理後的欄位值,另外, ModelForm 也會校驗模型欄位中設置的限制條件,比如在 Model 模型的欄位中添加了 unique 選項,那麼 is_valid 則會查詢資料庫確認是否存在重複數據。將表單應用到視圖函數中才是有意義的,下面我們就實現用戶添加的功能通過 ModelForm 來實現,首先在 index 目錄下創建模板文件 useradd_model_form.html 文件,編寫代碼如下所示:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>用戶添加</title></head><body><form action="" method="post"> {% csrf_token %} <table> {{ form }} </table> <input type="submit" value="提交"> </form></body></html>上面代碼有兩個需要注意的地方:由於指定了 POST 請求類型,需要 CSRF 保護機制,所以添加了 {%csrf_token%} 模板標籤;action 沒有設定 URL 的意思是將表單提交到與當前頁面相同的 URL。接下來實現 UserModelForm 並在視圖函數中應用它,代碼如所示:
class UserModelForm(forms.ModelForm): class Meta: model=UserInfo fields="__all__" widgets={'password':widgets.PasswordInput()}def user_add_form(request): if request.method=="Post": user=UserModelForm(request.Post) if user.is_valid(): user=UserInfo.objects.create(username=user.cleaned_data['username'], password=user.cleaned_data["password"], gender=user.cleaned_data['gender']) return render(request,'index/user_add.html',locals()) else: return render(request,'index/useradd_model_form.html',context={'form':user}) else: return render(request,'index/useradd_model_form.html',{'form':UserModelForm()})urlpatterns=[path('user_add_form/',views.user_add_form)]最後訪問 127.0.01:8000/index/user_add_form/ 可得如下頁面:
圖1:Django ModelForm定義表單
視圖函數 user_add_form 邏輯也不是很複雜,下面我們簡單總結一下:首選如果是 POST 請求,且表單欄位值合法,則創建 user 對象實例,然後是 POST 請求,但表單欄位值不合法,則返回表單頁面同時顯示錯誤提示信息,最後若不是 POST 請求,顯示錶單頁面。
通過上面的講解,我們使用 ModelForm 定義了好一個基本的用戶註冊表單,並把它應用到了視圖函數中,這也是通過它實現定義表單的基本流程。當然關於 ModelForm 還有一些基本知識沒有介紹,比如說它的 Meta 選項,還有它的 save 方法,在一節《Django ModelForm用法詳解》我們會作出講解。