一篇文章淺析Django Form組件相關(guān)知識
前言
在上一篇時,我們小試牛刀了以下Django Form組件的使用,一篇文章帶你了解Django Form組件(入門篇),沒來得及的小伙伴可以一起看看。但是你可能會有很多疑問,并不知道怎么使用。
并且知道Form組件的功能。
- 生成HTML標(biāo)簽。
- 驗證提交的數(shù)據(jù)。
- 保留提交之前的數(shù)據(jù)。
所以本篇就接著上次的繼續(xù),來一起學(xué)習(xí)以下Django Form組件如何使用。
Form組件的理解
沒有使用Form組件時
在一般情況下,我們?nèi)绻帉戄斎肟驎r,在Html中,一般都是這樣寫的。
代碼
- ...
- <form method="post" action="" novalidate>
- <div>
- <label>用戶名:</label>
- <input type="text" name="uname">
- </div>
- <div>
- <label>密碼:</label>
- <input type="text" name="upwd">
- </div>
- <div><input type="submit"></div>
- </form>
- ...
實現(xiàn)效果

使用Form組件時
在使用Form組件時,我們通常需要定義Form類。
這個Form,里面的字段,就可以理解為input標(biāo)簽,只不過是在后端寫的。
Form類
- from django.forms import Form
- class LoginForm(Form):
- uname = fields.CharField(label="用戶名")
- upwd = fields.CharField(label="密碼")
views.py
- from django.shortcuts import render
- def login(request):
- form = LoginForm()
- return render(request, "login_f.html", {"form": form})
html
- ...
- <form method="post" action="" novalidate>
- <div>
- <label>{{ form.uname.label }}:</label>
- {{ form.uname }}
- <!--
- form.uname.errors.0 是為了展示填寫不正確的錯誤信息
- errors.0是因為錯誤可能有多個
- 但是通常情況下,取第一個錯誤足夠
- -->
- {{ form.uname.errors.0 }}
- </div>
- <div>
- <label>{{ form.upwd.label }}:</label>
- {{ form.upwd }}
- {{ form.upwd.errors.0 }}
- </div>
- <div><input type="submit"></div>
- </form>
- ...
小總結(jié)
可以發(fā)現(xiàn),我并沒有寫input代碼,而是直接調(diào)用后端的form.<字段名>出來的。
Form類生成的Html

可以發(fā)現(xiàn),基本上和自己寫的Html差不多,生成的id為id+<字段名>。
Form生成的Html和手動寫Html對應(yīng)圖

通過對應(yīng)圖確定,通過后端的form.<字段>生成的直接就是input標(biāo)簽。
好了,到這,就確定了Form類,就是為我們生成input標(biāo)簽的。
Form使用
使用有以下步驟。
1.創(chuàng)建Form類,盡可能和models對上。
- class LoginForm(Form):
- uname = fields.CharField(label="用戶名")
- upwd = fields.CharField(label="密碼")
因為Form提交的數(shù)據(jù),可以轉(zhuǎn)換成dict,key就是Form字段名。
如果Form字段和models對上,直接models.<模型類>.objects.create(**dict)。
2.如果是GET請求,實例化Form對象,并且返回頁面。
- def login(request):
- if request.method == 'GET':
- form = LoginForm()
- return render(request, "login_f.html", {"form": form})
3.如果是POST請求,實例化Form對象時,傳入request.POST,request.FILES,并且驗證。
- # 接著上面
- elif request.method == "POST":
- form = LoginForm(request.POST, request.FILES)
- ########### 驗證數(shù)據(jù)
- if form.is_valid():
- # 驗證成功
- # 驗證成功之后的數(shù)據(jù),key就是Form類的字段名
- print(form.cleaned_data) # {'uname': '1212', 'upwd': '1212'}
- return HttpResponse("ok")
- # 驗證失敗
- # 雖然返回的還是頁面
- # 但是form會把上次輸入框內(nèi)容保存下來,并且還會展示errors信息
- return render(request, "login_f.html", {"form": form})
4.前端使用后端傳過來的form對象。
方式一,點每個字段
方式二,循環(huán)form對象
form對象是可以循環(huán)的,循環(huán)的每個form對象就是每個字段對象。
Form字段
Form組件主要是幫助我們做驗證的,所以,當(dāng)然有很多參數(shù)比如:
- 否可以為空。
- label展示的內(nèi)容。
- 等...
常用字段
Field類為所有字段的基類
Field參數(shù)如下
- required=True,是否允許為空,默認(rèn)True,不能為空
- widget=None,插件,展示的input具體信息
- label=None,label,標(biāo)簽展示的內(nèi)容
- help_text="",幫助信息(在標(biāo)簽旁邊顯示)
- error_massages=None,錯誤信息{"required":"不能為空",...}
- show_hidden_initial=False,是否在當(dāng)前插件后再加一個隱藏且具有默認(rèn)值的插件(可用于驗證兩次輸入是否一致)
- validators=[],自定義驗證規(guī)則函數(shù)
- localize=False,是否支持本地化
- disabled=False,是否可以編輯
- label_suffix=None,Label內(nèi)容后綴
CharField(Field),比較常用的字段之一
- min_length=None,最小長度
- max_length=None,最大長度
- strip=True,是否移除輸入空白
IntegerField(Field)
- max_value=None,最大值
- min_value=None,最小值
DecimalField(IntegerField)
- max_value=None,最大值
- min_value=None,最小值
- max_digits=None,最大長度
- decimal_places=None,小數(shù)位長度
其他字段還有
- BaseTemporalField(Field)
- DateField(BaseTemporalField)
- TimeField(BaseTemporalField)
- DateTimeField(BaseTemporalField)
- DurationField(Field)
- RegexField(CharField)
- EmailField(CharField)
- FileField(Field)
- ImageField(FileField)
- URLField(Field)
- BooleanField(Field)
- NullBooleanField(BooleanField)
...還有很多字段,這里就不一一贅述了,具體詳見官網(wǎng):
https://docs.djangoproject.com/zh-hans/2.0/ref/forms/api/#django.forms.BoundField
多選字段
- ChoiceField(Field)
- ...
- choices=() # 選項,如:choices = ((1,'一班'),(2,'二班'),)
- required=True # 是否必填
- widget=None # 插件,默認(rèn)select插件
- label=None # Label內(nèi)容
- initial=None # 初始值
- help_text='' # 幫助提示
- from django.forms.models import ModelChoiceField
- # 單選
- ModelChoiceField(ChoiceField)
- queryset=None # 查詢數(shù)據(jù)庫中的數(shù)據(jù)
- empty_label="---------" # 默認(rèn)空顯示內(nèi)容
- to_field_name=None # HTML中value的值對應(yīng)的字段
- limit_choices_to=None # ModelForm中對queryset二次篩選
- # 多選
- from django.forms.models import ModelMultipleChoiceField
- ModelMultipleChoiceField(ModelChoiceField)
- ...
widget參數(shù)對應(yīng)的插件
即使字段是CharField,但是最終效果以插件為主!
- TextInput(Input)
- NumberInput(TextInput)
- EmailInput(TextInput)
- URLInput(TextInput)
- PasswordInput(TextInput)
- HiddenInput(TextInput)
- Textarea(Widget)
- DateInput(DateTimeBaseInput)
- DateTimeInput(DateTimeBaseInput)
- TimeInput(DateTimeBaseInput)
- CheckboxInput
- Select
- NullBooleanSelect
- SelectMultiple
- RadioSelect
- CheckboxSelectMultiple
- FileInput
- ClearableFileInput
- MultipleHiddenInput
- SplitDateTimeWidget
- SplitHiddenDateTimeWidget
- SelectDateWidget
widget示例
- from django.forms import fields, widgets
- from django.forms import Form
- user = fields.CharField(
- initial=2,
- widget=widgets.RadioSelect(choices=((1,'一班'),(2,'二班'),))
- )
- # or
- user = fields.ChoiceField(
- choices=((1,'一班'),(2,'二班'),),
- initial=2,
- widget=widgets.RadioSelect
- )
- # 多選select,值為列表
- user = fields.MultipleChoiceField(
- choices=((1,'一班'),(2,'二班'),),
- initial=[1,],
- widget=widgets.SelectMultiple
- )
- # 從數(shù)據(jù)庫中獲取多選
- # 方式一
- from django.forms import Form
- from django.core.validators import RegexValidator
- class Form類(Form):
- user = fields.ChoiceField(
- # choices=((1,'一班'),(2,'二班'),),
- initial=2,
- widget=widgets.Select
- )
- def __init__(self, *args, **kwargs):
- super(MyForm,self).__init__(*args, **kwargs)
- # self.fields['user'].widget.choices = ((1,'一班'),(2,'二班'),)
- # 或
- self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')
- # 方式二
- from django.forms import models as form_model
- class Form類(Form):
- depart = form_model.ModelMultipleChoiceField(queryset=models.Depart.objects.all())
總結(jié)
本篇先從入門角度說如何使用簡單使用Django Form組件,使用Form組件和沒使用Form組件的區(qū)別。
然后講了以下Form如何使用。
- 首先GET請求時,返回頁面。
- POST請求時,驗證數(shù)據(jù),判斷是否符合規(guī)則。
- 如果失敗返回錯誤信息,如果成功繼續(xù),寫入數(shù)據(jù)庫。
最后列舉出常用的Form字段,還有如何使用多選字段。