最近用Django 寫了一個網站,現在來分享一下對Django form 的一些心得。
一,創建一個表單
創建一個Form表單有兩種方式:
第一種方式是繼承於forms.Form,的一個子類,通過在form中選擇你需要的類型來規定表單之
中字段的類型
- class ContactForm(forms.Form):
- subject = forms.CharField(max_length=100)
- message = forms.CharField(required=False)
其中 django 內置了很多的字段,讓開發者可以直接使用,並且內置了這些字段的檢驗使站點中的表單數據檢測變得方便,也提供了一些可選擇的檢驗規則如required=False等,具體的可以去Django 官網查詢API。
第二種 是直接利用數據庫中以有的表來生成表單項, 這對於一個管理系統類型的網站 比較有用,因為如果一個站點有大量的實體數據需要讓用戶輸入,那么就不必重新花費時間來定義表單,只需要直接的和 model 進行關聯就可以了如:
- class BookForm(ModelForm):
- class Meta:
- model = Book
這樣就可以 直接將 book 中的所有字段 直接生成一張 與之對應的表單,也許你不想所有的模型中的字段用戶都可以填寫,那么你可以用
- class Meta:
- model = Author
- fields = ('name', 'title')
- class Meta:
- model = Author
- exclude = ('birth_date',)
exclude 屬性來規定哪些字段你不想加入在表單之中。
fields屬性來規定哪些你要加入表單之中,當然兩個屬性,你只要設定一個就可以了
二,修飾這個表單
因為用django自動生成的表單,實現的內容很多是你不想要的,所以要創造一個獨特的表。
改變字段在模板中顯示的類型
你繼承於ModelForm來創建一個表單的話,Django會自動的將外鍵字段轉化成一個select的控件,並且通過下拉框來選擇一個值,這可能是你不想要的,因為你可能不希望用戶來填寫外鍵的內容,這些外鍵的內容是系統自動關聯分配的,所以,你就必須更改表單項的實現方式。
- model = Author
- fields = ('name', 'title', 'birth_date')
- widgets = {
- 'name': Textarea(attrs={'cols': 80, 'rows': 20}),
- }
通過widgets這個參數,手動的設定字段以何種input類型顯示
更改報錯信息
在django表單系統之中,如果在處理表中中 使用 is_valid()
方法並且表單檢測發現表單內容不符合規則,那么他將返回一個表單,表單之中沒一樣中 form.name.errors 就是報錯信息,雖然現在在服務器端檢驗表單字段的實用價值已經越來越小了,但是 俗話說, 永遠不要相信前台腳本,永遠不要相信用戶,他們很可能利用你沒有后台檢驗的功能而 搞出很多的事情來,所以盡管前台已經做了檢驗,但是后台仍然要做一次檢驗,更改默認的報錯信息是這樣的
- name = forms.CharField(error_messages={'required': 'Please enter your name'})
在創建這個 表單的時段的時候 傳入如下的參數,就可以修改報錯信息,當然你必須知道具體錯誤的名稱 如“requeired”這些名稱可以在API 中找到
三,使用這個表單
在視圖中使用
在視圖中使用一個表單 無非是兩種功能,一個是創建一個表單讓用戶來填寫信息,另一個是處理表單中的數據。
創建一個表單 就是直接創建一個 實體表單的對象
form = ContactForm(),里面有幾個比較重要的參數:auto_id=False
這個參數 主要是表示 是否在表單中生成 id ,因為有的時候你不想讓你每個表單的字段都對應一個id, 如果生成 默認id是 id_form字段名字.
設置默認值
可以在創建 表單對象時傳入如下參數initial={}
這是一個字典參數,對應每個字段的默認值, 可以在定義表的時候在沒定義一個時段 中添加 initial='http://' 來設定默認值
更新數據
你可能需要 用一個 model實例來初始化他,這樣就可以達到表單更新數據
f = ArticleForm(instance=a) 其中 a 是article 的一個model實例。
提取數據
在 處理 post 請求時候, 通過 f = ArticleForm(request.POST)來獲取一個填有用戶數據的form
在調用了 is_valid 方法以后 就可以通過 f.cleaned_data ,返回一個 裝有數據的字典
總結:
上面直接 介紹很少的 form 的功能,只是讓大家了解一下 django form,具體的要去官方API介紹還可以,英文也比較好理解,就我對 django表單而言, 我認為它是方便好用的,但是盡量大家不要過分的依賴django所提供的功能,盡管他提供了 強大的功能,很多事情還是要一步一步來,過分的依賴 它提供的功能,會造成你整個的系統變得非常不靈活。