對於Django不太熟且開發經驗不太多的同學,寫前後端傳參的時候,可能會把所有參數都寫一遍,或者進行遍歷。但是這樣寫會有以下幾個問題點:
- 用戶提交數據需要單獨寫校驗;
- 錯誤信息要單獨寫前端代碼進行展示;
- 頁面上每一個欄位都需要寫代碼;
- 關聯數據,需要手動獲取並遍歷展示。
而且實際工作中,即使想手動完成上面這些點,也很容易遺漏導致bug出現。
而Django為了幫忙開發者處理以上問題,更快捷的完成開發工作,提供了一個組件:ModelFORM
ModelForm簡介
從字面意思就可以看出來,這個組件的功能就是把model和form組合起來。初看這是句廢話,熟練使用後就會有種就是這樣的明悟。
ModelForm使用演示
準備Model類,這裡準備了這樣兩個:
其中Department重寫了__str__方法,是為了在前端能直接顯示部門名稱,默認的__str__方法返回的是對象的內存地址。
引入ModelForm,將這個ModelForm和Model關聯起來:
可以看到在ModelForm中引入了Model,參數fields是用來定義這個ModelForm中具體的欄位的,可以直接從Model中取,也可以自己重新定義,比如這裡就重新定義了name的欄位長度必須不小於3個字符。
還重寫了一遍__init__方法,這是為了讓前端顯示時有一個風格,默認是全部堆積在一起的,不太美觀。
在需要使用這個ModelForm的時候,可以這樣:
在模板文件中可以這樣使用:
其中參數field.label就是Model中定義欄位時設置的verbose_name。
最終顯示到前端的效果:
後端接收提交的邏輯就比較簡單了,不再需要單個取欄位往Model中存,只需要這樣:
is_valid方法是校驗數據是否有效,校驗的標準是資料庫是否支持和自己定義的欄位規則。如果數據有效,就可以直接調用save方法,不用寫代碼用Model存資料庫,當然save其實底層也是一樣在調用ORM。保存成功後就跳轉到列表頁面。
如果上傳的數據有問題,就將這個數據返回給前端,讓前端展示錯誤信息。前面的模板文件中可以看到有一個field.errors.0,其實是可能存在多個error同時存在的,但是沒必要一次性全部展示,所以這裡只展示第一條error。
前端報錯效果:
Django默認是使用英文的,提示語是跟隨Django的設置的,要改變語言的話可以到settings.py中調整:
其中zh-hans表示中文。
總結
如果學過Java後端開發,對於這裡提的ModelForm應該會有似曾相識的感覺。雖然現在都是前後端分離,前後端基本都是在使用json交互,但是Django的ModelForm還是值得一看的,在一些小項目中非常值得一用。