Django之Form组件
生活随笔
收集整理的這篇文章主要介紹了
Django之Form组件
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、Form組件介紹
1、Form組件可以做的幾件事情
1、用戶請求數(shù)據(jù)驗證
2、自動生成錯誤信息
3、打包用戶提交的正確信息
4、如果其中有一個錯誤了,其他的正確這,保留上次輸入的內(nèi)容
5、自動創(chuàng)建input標(biāo)簽并可以設(shè)置樣式
2、Django內(nèi)置字段如下
Fieldrequired?=?True,???????#是否允許為空widget?=?None,?????????#HTML插件label?=?None,?????????#用于生成Label標(biāo)簽或顯示內(nèi)容initial?=?None,???????#初始值help_text?=?'',???????#幫助信息(在標(biāo)簽旁邊顯示)error_messages?=?None,?#錯誤信息{'required':?'不能為空',?'invalid':?'格式錯誤'}show_hidden_initial?=?False,?#是否在當(dāng)前插件后面再加一個隱藏的且具有默認(rèn)值的插件(可用于檢驗兩次輸入是否一直)validators?=?[],???????#自定義驗證規(guī)則localize?=?False,?????#是否支持本地化disabled?=?False,??????#是否可以編輯label_suffix?=?None????#Label內(nèi)容后綴CharField(Field)max_length?=?None,????#最大長度min_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)input_formats?=?None???#?時間格式化DateField(BaseTemporalField)??????#格式:2015?-?09?-?01TimeField(BaseTemporalField)?????#?格式:11:?12DateTimeField(BaseTemporalField)??#格式:2015?-?09?-?01?11:?12DurationField(Field)??????????????#時間間隔:?%?d?%?H:?%?M:?%?S.?%?f...RegexField(CharField)regex,??????????????????#自定制正則表達(dá)式max_length?=?None,?????#最大長度min_length?=?None,?????#最小長度error_message?=?None,??#忽略,錯誤信息使用error_messages?=?{'invalid':?'...'}FileField(Field)allow_empty_file?=?False???#是否允許空文件ChoiceField(Field)...choices?=?(),????????#選項,如:choices?=?((0,?'上海'),?(1,?'北京'),)required?=?True,????#是否必填widget?=?None,??????#插件,默認(rèn)select插件label?=?None,???????#Label內(nèi)容initial?=?None,?????#初始值help_text?=?'',??????#幫助提示ModelChoiceField(ChoiceField)...?????????????????django.forms.models.ModelChoiceFieldqueryset,?????????????????????#?查詢數(shù)據(jù)庫中的數(shù)據(jù)empty_label?=?"---------",??#?默認(rèn)空顯示內(nèi)容to_field_name?=?None,?????????#?HTML中value的值對應(yīng)的字段limit_choices_to?=?None???????#?ModelForm中對queryset二次篩選ModelMultipleChoiceField(ModelChoiceField) ...?????????????????????????django.forms.models.ModelMultipleChoiceFieldTypedChoiceField(ChoiceField)coerce?=?lambda?val:?val?????#對選中的值進(jìn)行一次轉(zhuǎn)換empty_value?=?''?????????????#?空值的默認(rèn)值TypedMultipleChoiceField(MultipleChoiceField)coerce?=?lambda?val:?val???????#對選中的每一個值進(jìn)行一次轉(zhuǎn)換empty_value?=?''????????????????#空值的默認(rèn)值ComboField(Field)fields?=?()????#使用多個驗證,如下:即驗證最大長度20,又驗證郵箱格式?fields.ComboField(fields=[fields.CharField(max_length=20),?fields.EmailField(),?])SplitDateTimeField(MultiValueField)input_date_formats?=?None,?#格式列表:['%Y--%m--%d',?'%m%d/%Y',?'%m/%d/%y']input_time_formats?=?None???#格式列表:['%H:%M:%S',?'%H:%M:%S.%f',?'%H:%M']FilePathField(ChoiceField)???#文件選項,目錄下文件顯示在頁面中path,????????????????????#文件夾路徑match?=?None,???????????#正則匹配recursive?=?False,??????#遞歸下面的文件夾allow_files?=?True,??????#允許文件allow_folders?=?False,??#允許文件夾required?=?True,widget?=?None,label?=?None,initial?=?None,help_text?=?''GenericIPAddressFieldprotocol?=?'both',?????both,?ipv4,?ipv6支持的IP格式unpack_ipv4?=?False????解析ipv4地址,如果是::ffff:?192.0.2.1時候,可解析為192.0.2.1,?PS:protocol必須為both才能啟用3、常用選擇插件
#?單radio,值為字符串 user?=?fields.CharField(initial=2,widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),)) )#?單radio,值為字符串 user?=?fields.ChoiceField(choices=((1,?'上海'),?(2,?'北京'),),initial=2,widget=widgets.RadioSelect )#?單select,值為字符串 user?=?fields.CharField(initial=2,widget=widgets.Select(choices=((1,'上海'),(2,'北京'),)) )#?單select,值為字符串 user?=?fields.ChoiceField(choices=((1,?'上海'),?(2,?'北京'),),initial=2,widget=widgets.Select )#?多選select,值為列表 user?=?fields.MultipleChoiceField(choices=((1,'上海'),(2,'北京'),),initial=[1,],widget=widgets.SelectMultiple )#?單checkbox user?=?fields.CharField(widget=widgets.CheckboxInput() )#?多選checkbox,值為列表 user?=?fields.MultipleChoiceField(initial=[2,?],choices=((1,?'上海'),?(2,?'北京'),),widget=widgets.CheckboxSelectMultiple )
二、表單渲染注冊頁面
views.py文件內(nèi)容:
from?django.shortcuts?import?render,HttpResponse from?django?import?forms from?django.forms?import?widgetsclass?UserForm(forms.Form):user=forms.CharField(label="用戶名",min_length=5,error_messages={"required":"不能為空","min_length":"最小長度不能小于5"},widget=widgets.TextInput(attrs={"class":"form-control"}))tel=forms.CharField(label="手機(jī)號",max_length=8,?widget=widgets.TextInput(attrs={"class":"form-control"}))email=forms.EmailField(label="郵箱",?widget=widgets.TextInput(attrs={"class":"form-control"})) def?reg(request):if?request.method=="POST":#form=UserForm({"user":"alex999","tel":'123',"email":"111","123":123})form=UserForm(request.POST)if?form.is_valid():print("====>",form.cleaned_data)????????#?校驗成功的字段{"user":"alex999","tel":'123'}print("====>",form.errors)??????????????#?校驗失敗的字段return?HttpResponse("添加成功")else:#?print("---->",?form.cleaned_data)??##?print("---->",?type(form.errors))??#?<class?'django.forms.utils.ErrorDict'>#?print("---->",?type(form.errors["user"]))??##?print("---->",?form.errors["user"][0])??#return?render(request,?'reg.html',{"form":form})form=UserForm()return?render(request,'reg.html',{"form":form})
reg.html文件內(nèi)容:
<!DOCTYPE?html> <html> <head><meta?charset="UTF-8"><meta?http-equiv="X-UA-Compatible"?content="IE=edge"><meta?name="viewport"?content="width=device-width,?initial-scale=1"><title>Title</title><style>span{color:?red!important;}</style><link?rel="stylesheet"?href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"?integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"?crossorigin="anonymous"> </head> <body> {#####################################方案一:#######################################} <div><div><div?class="col-md-6?col-md-offset-3"><form?action=""?method="post"?novalidate>{%?csrf_token?%}{%?for?filed?in?form?%}<div><label?for="">{{?filed.label?}}</label>{{?filed?}}</div>{%?endfor?%}<input?type="submit"></form></div></div> </div> {#####################################方案二:#######################################} <div><div><div?class="col-md-6?col-md-offset-3"><form?action=""?method="post"?novalidate>{%?csrf_token?%}<div>用戶名:{{?form.user?}}</div><div>郵箱:{{?form.email?}}</div><div>手機(jī)號:{{?form.tel?}}</div><input?type="submit"></form></div></div> </div> {#####################################方案三:#######################################} <div><div><div?class="col-md-6?col-md-offset-3"><form?action=""?method="post"?novalidate>{%?csrf_token?%}{{?form.as_p?}}<input?type="submit"></form></div></div> </div></body> </html>
三、示例
views.py文件內(nèi)容:
from?django.shortcuts?import?render,redirect from?app01?import?models from?django.forms?import?Form from?django.forms?import?fields from?django.forms?import?widgets class?TeacherForm(Form):??#必須繼承Formusername?=?fields.CharField(required=True,???????????????????????????????????????????????????????????????#必填字段error_messages={"required":"用戶名不能為空!!"},????????????????????????????#顯示中文錯誤提示widget=widgets.TextInput(attrs={"placeholder":"用戶名","class":"form-control"})??#自動生成input框)password?=?fields.CharField(required=True,?error_messages={'required':?'密碼不能為空'},widget=widgets.TextInput(attrs={'placeholder':?'密碼',?'class':?'form-control'}))??#?不能為空email?=?fields.EmailField(required=True,error_messages={"required":"郵箱不能為空!!","invalid":"無效的郵箱"},widget=widgets.EmailInput(attrs={"placeholder":?"郵箱",?"class":?"form-control"})??#?自動生成input框)????????????????????????????????????????????????????????????????????????????????????#不能為空且郵箱格式要一致 def?teacherindex(request):teacher_obj?=?models.UserInfo.objects.all()return?render(request,"teacherindex.html",{"teacher_obj":teacher_obj}) def?add(request):if?request.method=="GET":form?=?TeacherForm()??????????????????????????????????????????????????#只是讓顯示一個input框return?render(request,"add.html",{"form":form?})else:form?=?TeacherForm(data=request.POST)#?print(form)??#<QuerySet?[<UserInfo:?UserInfo?object>,?<UserInfo:?UserInfo?object>,?<UserInfo:?UserInfo?object>]>if?form.is_valid():????????????????????????????????????#?開始驗證#?print('執(zhí)行成功',form.cleaned_data)??????????????#?所有匹配成功,字典form.cleaned_data['ut_id']?=?1???????????????????#要分的清是班主任還是講師models.UserInfo.objects.all().create(**form.cleaned_data)return?redirect("/teacherindex/")else:#?print("=====?",form.errors,type(form.errors))#返回失敗的結(jié)果#?print(form.errors["username"][0])???#拿到返回失敗的結(jié)果,渲染到頁面return?render(request,"add.html",{"form":form})
前端html頁面:
{%?block?right?%}<h1>添加老師信息</h1><hr><form?method="post"?novalidate>{%?csrf_token?%}<p>姓名:{{?form.username?}}</p>{{?form.errors.username.0?}}<p>密碼:{{?form.password?}}</p>{{?form.errors.password.0?}}<p>郵箱:{{?form.email?}}</p>{{?form.errors.email.0?}}<p><input?type="submit"?value="提交"></p></form> {%?endblock?%}
轉(zhuǎn)載于:https://blog.51cto.com/qidian510/2113301
總結(jié)
以上是生活随笔為你收集整理的Django之Form组件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL主从布署
- 下一篇: 7、字典和string的用法