PythonWeb開發(fā)基礎(chǔ)教程第7章表單課件_第1頁
PythonWeb開發(fā)基礎(chǔ)教程第7章表單課件_第2頁
PythonWeb開發(fā)基礎(chǔ)教程第7章表單課件_第3頁
PythonWeb開發(fā)基礎(chǔ)教程第7章表單課件_第4頁
PythonWeb開發(fā)基礎(chǔ)教程第7章表單課件_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Python Web開發(fā)基礎(chǔ)教程(Django版)第1頁,共55頁。第7章 表單本章主要內(nèi)容:表單基礎(chǔ)Django表單進階模型表單資源Ajax第2頁,共55頁。7.1 表單基礎(chǔ)本節(jié)主要內(nèi)容HTML表單Django表單第3頁,共55頁。7.1.1HTML表單一個典型的HTML表單如下。 請輸入數(shù)據(jù): 該表單由靜態(tài)HTML實現(xiàn),要直接在瀏覽器中訪問該表單,需將其放在Django項目的static文件夾中。靜態(tài)資源配置的詳細內(nèi)容請參考2.1.4節(jié)。第4頁,共55頁。一個表單主要包括提交地址、請求方法和表單元素三個部分。表單的action屬性指定的URL為提交地址,它接收表單數(shù)據(jù),并執(zhí)行相應(yīng)的處理。表

2、單的method屬性指定請求方法,通常是GET或POST。通常,在不改變服務(wù)器數(shù)據(jù)時用GET方法,提交的數(shù)據(jù)會顯示在URL中。要改變服務(wù)器數(shù)據(jù)時用POST方法,提交的數(shù)據(jù)封裝在消息體中。第5頁,共55頁。Django項目的模板文件是一個HTML文件,可在其中定義HTML表單??赏ㄟ^視圖將數(shù)據(jù)傳遞給模板,然后使用模板變量將其填充到HTML表單。Django模板中的HTML表單典型結(jié)構(gòu)如下。 % csrf_token % 請輸入數(shù)據(jù): 相比于前面的HTML表單,模板中多了一個% csrf_token %標簽和一個 current_data 變量。將此模板(temform.html)放在項目的tem

3、plates文件夾中,以便在視圖中使用。默認情況下,Django會對所有的POST請求執(zhí)行CSRF(跨站點請求偽造)保護。% csrf_token %標簽用于獲取CSRF令牌,如果沒有該標簽,Django會拒絕表單請求。 current_data 用于將視圖傳遞給模板的數(shù)據(jù)插入到當(dāng)前位置。第6頁,共55頁。7.1.2Django表單模板中的HTML表單屬于靜態(tài)編碼,要改變表單就必須修改模板。Django表單通過擴展django.forms.Form類可在視圖中動態(tài)生成表單。使用Django表單的基本步驟包括:定義表單類定義使用表單類和模板的視圖定義表單模板配置URL訪問視圖第7頁,共55頁。1

4、定義表單類#chapter7chapter7views.pyfrom django import formsclass dataForm(forms.Form): data = forms.CharField(label=請輸入數(shù)據(jù))自定義的表單類dataForm繼承了django.forms.Form類,它包含一個data字段。字段data的類型為forms.CharField。表單data字段會被渲染為一個元素和一個元素。表單字段的label參數(shù)指定在表單渲染生成的元素中顯示的字符串。第8頁,共55頁。2定義使用表單類和模板的視圖在視圖中需要創(chuàng)建表單類的實例對象,并將其作為參數(shù)傳遞給模板,

5、代碼如下。def useDataForm(request): if request.method = POST: form = dataForm(request.POST) #使用接收到的數(shù)據(jù)創(chuàng)建表單 msg=已完成數(shù)據(jù)提交! else: form = dataForm()#創(chuàng)建空白表單 msg=初始表單 return render(request, temdataform.html, form: form,msg:msg)在直接使用HTML表單時,視圖將接收到的數(shù)據(jù)傳遞給模板,以便在響應(yīng)頁面中回顯數(shù)據(jù)。在使用Django表單時,視圖使用接收到的數(shù)據(jù)創(chuàng)建表單,先將數(shù)據(jù)填入表單字段,再將表單對象

6、傳遞給模板。第9頁,共55頁。3定義表單模板模板通過變量使用視圖傳遞的表單對象,代碼如下。 % csrf_token % form msg第10頁,共55頁。4配置URL訪問視圖URL配置代碼如下。from django.urls import pathfrom . import viewsurlpatterns = path(dform/, views.useDataForm),第11頁,共55頁。7.2 Django表單進階本節(jié)主要內(nèi)容表單字段渲染方式表單字段類型和參數(shù)使用小部件字段校驗使用表單數(shù)據(jù)手動渲染字段遍歷字段表單集第12頁,共55頁。7.2.1表單字段渲染方式Django提供了3

7、種表單字段渲染方式。 form.as_table :表單式樣式,默認方式。將字段渲染為包裝在表格元素中的表單元素。 form.as_p :段落樣式,將字段渲染為包裝在元素中的段落。 form.as_ul :列表樣式,將字段渲染為包裝在元素中的列表項。第13頁,共55頁。7.2.2表單字段類型和參數(shù)表單字段的定義包含字段名、字段類型和字段參數(shù)3個部分,示例如下。class dataForm(forms.Form): data = forms.CharField(label=請輸入數(shù)據(jù))#定義表單字段其中,data為字段名,字段渲染生成的元素的for屬性值為“id_data”,生成的元素的name

8、屬性值為“data”、id屬性值為“id_data”。CharField為字段類型,label為字段參數(shù)。django.forms模塊定義了一系列字段類來描述表單字段的類型。字段類型決定了Django如何執(zhí)行下列操作。字段被渲染成哪種HTML表單元素。是否必須為字段提供數(shù)據(jù)。默認情況下,所有類型的字段都必須提交數(shù)據(jù)。如何校驗字段數(shù)據(jù)。如何將數(shù)據(jù)規(guī)范化為Python數(shù)據(jù)。第14頁,共55頁。表7-1常用表單字段類字段類默認渲染成的表單元素Python數(shù)據(jù)的類型BooleanFieldCheckboxInputTrue或FalseCharFieldTextInput字符串ChoiceFieldSe

9、lect字符串DateFieldDateInputdatetime.dateTimeFieldTimeInputdatetime.timeDecimalFieldNumberInput(未本地化時)或TextInputdecimalFloatFieldNumberInput(未本地化時)或TextInputfloatIntegerFieldNumberInput(未本地化時)或TextInputinteger第15頁,共55頁。字段類默認渲染成的表單元素Python數(shù)據(jù)的類型EmailFieldEmailInput字符串FileFieldClearableFileInput上傳的文件FileP

10、athFieldSelect字符串ImageFieldClearableFileInput上傳的圖片文件GenericIPAddressFieldTextInput字符串MultipleChoiceFieldSelectMultiple字符串列表RegexFieldTextInput字符串UUIDFieldTextInputUUID第16頁,共55頁。1required默認情況下,所有類型的表單字段的required屬性值均為True,即必須為字段提供數(shù)據(jù)。如果提供的是None或空字符串,校驗數(shù)據(jù)時會觸發(fā)ValidationError異常。表單字段的clean()方法用于執(zhí)行數(shù)據(jù)清理操作,驗證

11、數(shù)據(jù)的有效性。數(shù)據(jù)有效時,clean()方法會返回該數(shù)據(jù),否則觸發(fā)ValidationError異常。第17頁,共55頁。2labellabel參數(shù)用于設(shè)置表單字段被渲染為HTML 元素時的文本內(nèi)容,示例代碼如下。 class test(forms.Form):. name=forms.CharField(label=請輸入姓名). print(test()請輸入姓名:在創(chuàng)建表單時,可使用auto_id=False來簡化渲染結(jié)果,示例代碼如下。 d=test(auto_id=False) print(d)請輸入姓名:第18頁,共55頁。3label_suffixlabel_suffix屬性用于

12、設(shè)置表單字段被渲染為HTML 元素時的文本內(nèi)容的后綴,默認后綴為英文冒號“:”示例代碼如下。 class test(forms.Form):. addr=forms.CharField(label=聯(lián)系地址,label_suffix=*). print(test()聯(lián)系地址*第19頁,共55頁。4initialinitial參數(shù)用于設(shè)置字段的初始值,示例代碼如下。 class test(forms.Form):. name=forms.CharField(initial=someone). print(test(auto_id=False)Name:也可在創(chuàng)建表單對象時提供初始值,示例代碼如下

13、。 d=test(name:Lining,auto_id=False) print(d)Name:第20頁,共55頁。5help_texthelp_text參數(shù)用于設(shè)置字段的幫助信息,幫助信息被渲染為元素示例代碼如下。 class test(forms.Form):. name=forms.CharField(help_text=姓名包含字母、數(shù)字等字符). print(test(auto_id=False)Name:姓名包含字母、數(shù)字等字符第21頁,共55頁。6error_messageserror_messages用于設(shè)置自定義錯誤信息,它將覆蓋默認的錯誤信息。error_messages

14、的參數(shù)值為字典對象,其中的每個鍵值對對應(yīng)一條校驗錯誤信息示例代碼如下。 name=forms.CharField(error_messages=required:必須提供name字段數(shù)據(jù)) name.clean()#驗證字段取空值,觸發(fā)異常Traceback (most recent call last): django.core.exceptions.ValidationError: 必須提供name字段數(shù)據(jù)第22頁,共55頁。7disableddisabled參數(shù)被設(shè)置為True時,不允許表單字段渲染成的HTML元素與用戶交互示例代碼如下。 class test(forms.Form):

15、. addr=forms.CharField(label=聯(lián)系地址,disabled=True). print(test()聯(lián)系地址:第23頁,共55頁。7.2.3使用小部件表單字段的widget參數(shù)用于指定渲染字段時使用的小部件(也稱組件)示例代碼如下。 class test(forms.Form):. name=forms.CharField(widget=forms.Textarea). print(test()Name:第24頁,共55頁。表7-2常用小部件小部件輸入類型渲染結(jié)果TextInput文本NumberInput數(shù)字EmailInputE-mail地址URLInputURLP

16、asswordInput用于輸入密碼HiddenInput隱藏的表單元素DateInput日期字符串DateTimeInput日期時間字符串TimeInput時間字符串Textarea長文本.CheckboxInput復(fù)選框Select選項列表.NullBooleanSelect類似Select選項為Unknown、Yes和No的SelectMultiple類似Select,可多選.RadioSelect單選按鈕組包含在元素中的單選按鈕組CheckboxSelectMultiple復(fù)選框 .FileInput文件上傳SelectDateWidget日期選項列表封裝了3個Select來選擇年、月

17、、日??捎脃ears和months參數(shù)指定年份和月份選項第25頁,共55頁。7.2.4字段校驗通常,Django根據(jù)字段類型執(zhí)行默認的校驗操作。例如,默認所有表單字段的required屬性為True,字段不接受空值。表7-3列出了表單字段除了required之外的其他校驗操作。第26頁,共55頁。表7-3常用表單字段類與校驗操作字段類校驗操作錯誤信息關(guān)鍵字BooleanField驗證給定值是否為True requiredCharField根據(jù)max_length和min_length選項設(shè)置校驗最大、最小長度required、max_length、min_lengthChoiceField驗證

18、給定值是否包含在選項列表中required、invalid_choiceDateField驗證數(shù)據(jù)是否為datetime.date、 datetime.datetime或日期格式的字符串required、invalidTimeField驗證數(shù)據(jù)是否為datetime.time或時間格式的字符串required、invalidDecimalField驗證數(shù)據(jù)是否為小數(shù)。根據(jù)max_value和min_value設(shè)置校驗最大值、最小值required、invalid、max_value、min_value、max_digits、max_decimal_places、max_whole_digits

19、FloatField驗證數(shù)據(jù)是否為浮點數(shù)。根據(jù)max_value和min_value設(shè)置校驗最大值、最小值required、invalid、max_value、min_valueIntegerField驗證數(shù)據(jù)是否為整數(shù)。根據(jù)max_value和min_value設(shè)置校驗最大值、最小值required、invalid、max_value、min_valueEmailField驗證數(shù)據(jù)是否為有效的電子郵件地址required、invalidFileField根據(jù)max_length和allow_empty_file設(shè)置驗證最大長度和是否允許空文件required、invalid、missing、

20、empty、max_lengthFilePathField驗證數(shù)據(jù)是否包含在選項列表中required、invalid_choiceImageField驗證是否上傳了圖片文件required、invalid、missing、empty、invalid_imageGenericIPAddressField驗證數(shù)據(jù)是否為有效的IP地址required、invalidMultipleChoiceField驗證數(shù)據(jù)是否存在于選項列表中required、invalid_choice、invalid_listRegexField驗證數(shù)據(jù)是否與某個正則表達式匹配required、invalidUUIDFie

21、ld驗證數(shù)據(jù)是否為有效的UUID字符串required、invalid第27頁,共55頁。7.2.5使用表單數(shù)據(jù)通常,request.POST包含了表單采用POST請求方法提交的數(shù)據(jù)。request.POST中的數(shù)據(jù)沒有被轉(zhuǎn)換為Python類型,也沒有經(jīng)過校驗。表單通過校驗時,is_valid()函數(shù)返回True。表單中通過校驗的數(shù)據(jù)被包含在cleaned_data字典中。在使用表單數(shù)據(jù)時,應(yīng)盡量使用cleaned_data中的數(shù)據(jù)。第28頁,共55頁。1綁定表單設(shè)置了數(shù)據(jù)的表單稱為綁定表單(is_bound屬性為True),沒有數(shù)據(jù)的表單稱為未綁定表單(is_bound屬性為False)。例

22、如: class test(forms.Form): . name=forms.CharField(max_length=50). age=forms.IntegerField(max_value=50). d=test()#創(chuàng)建空表單 d.is_bound#結(jié)果為False,說明表單未綁定False d=test()#綁定空值時,表單也被綁定 d.is_bound#結(jié)果為True,說明表單已綁定True d=test(name:mike,age:20)#綁定具體數(shù)據(jù) d.is_boundTrue第29頁,共55頁。應(yīng)注意,在定義表單時為字段設(shè)置的初始值,只用于在表單字段被渲染為HTML元素時

23、設(shè)置元素的初始值。即使有初始值,空表單仍是未綁定的,示例代碼如下。 class test(forms.Form):. name=forms.CharField(max_length=50,initial=noname). age=forms.IntegerField(max_value=50,initial=20). d=test()#創(chuàng)建空表單 d.is_bound#結(jié)果為False,說明表單未綁定False第30頁,共55頁。2使用“干凈的”數(shù)據(jù)調(diào)用表單is_valid()方法時會執(zhí)行數(shù)據(jù)校驗,當(dāng)所有字段數(shù)據(jù)均合法時,方法返回True,否則返回False。執(zhí)行校驗時,Django為表單對象

24、創(chuàng)建cleaned_data屬性。通過校驗的數(shù)據(jù)是“干凈的”,被保存在表單的cleaned_data屬性中。cleaned_data屬性只能在執(zhí)行校驗之后訪問,否則會觸發(fā)AttributeError異常。第31頁,共55頁。7.2.6手動渲染字段在表單模板中,可以使用form、form.as_table、form.as_p和form.as_ul等變量獲得表單字段的默認渲染效果,詳見7.2.1節(jié)。Django允許在表單模板中自定義表單字段的渲染效果。在模板中,用form.字段名格式來訪問表單字段。第32頁,共55頁。7.2.7遍歷字段在表單模板中,也可用%for%循環(huán)來遍歷表單字段。表單字段的常

25、用屬性如下。 form.字段名.label :字段的label文本,例如,“姓名”。 form.字段名.label_tag :封裝在HTML 元素中的label文本,包含表單的 label_suffix。 form.字段名.value :字段值。 form.字段名.help_text :字段的幫助文本。 form.字段名.errors :字段未通過驗證時的錯誤信息。 form.字段名.field :表單字段的 BoundField實例對象,用于訪問字段屬性。例如, .field.max_length 。第33頁,共55頁。7.2.8表單集表單集是表單對象的集合,用于處理多個表

26、單。可調(diào)用django.forms模塊提供的formset_factory()工廠類方法創(chuàng)建表單集類,示例代碼如下。classTestFormset=formset_factory(test,extra=2) #創(chuàng)建表單集類test參數(shù)為自定義的表單類。extra參數(shù)指定表單集中包含的表單個數(shù),默認為1。創(chuàng)建了表單集類后,就可用其來創(chuàng)建表單集對象,示例代碼如下。formset = classTestFormset(request.POST)#使用客戶端數(shù)據(jù)初始化表單集formset = classTestFormset()#創(chuàng)建空白表單集在視圖函數(shù)中,可將表單集對象傳遞給模板,示例代碼如下。d

27、ef useFormset(request): classTestFormset=formset_factory(test,extra=2) #創(chuàng)建表單集類 if request.method = POST: formset = classTestFormset(request.POST) else: formset = classTestFormset()return render(request, temformset.html, formset: formset)#將表單集傳遞給模板第34頁,共55頁。7.3 模型表單本節(jié)主要內(nèi)容模型表單基本操作在視圖中使用模型表單自定義模型表單字段第3

28、5頁,共55頁。7.3.1模型表單基本操作模型表單指綁定到模型的表單。自定義的模型表單需擴展django.forms模塊提供的ModelForm類。模型表單基本操作包括定義模型、定義模型表單以及使用模型表單為數(shù)據(jù)庫添加和修改數(shù)據(jù)。第36頁,共55頁。1定義模型模型代碼如下。#chapter7chapter7models.pyfrom django.db import modelsclass person(models.Model): name=models.CharField(max_length=8) age=models.SmallIntegerField()用于模型表單的模型與普通模型并

29、沒有任何區(qū)別。第37頁,共55頁。2定義模型表單模型表單代碼如下。#chapter7chapter7views.pyfrom django.forms import ModelFormfrom models import personclass personForm(ModelForm): class Meta: model = person fields = name, age第38頁,共55頁。模型表單有兩個特點:必須繼承django.forms.ModelForm類。提供子類Meta。在Meta的model字段中綁定模型,在fields字段中設(shè)置在表單中使用的模型字段??梢允褂锰厥庵怠癬

30、all_”表示使用模型全部字段,示例代碼如下。fields = _all_也可使用exclude屬性來排除不使用的字段,示例代碼如下。exclude = age第39頁,共55頁。3使用模型表單為數(shù)據(jù)庫添加數(shù)據(jù)首先使用數(shù)據(jù)作為參數(shù)來創(chuàng)建模型表單,再調(diào)用表單的save()方法將數(shù)據(jù)寫入數(shù)據(jù)庫,示例代碼如下。 from chapter7.models import person from chapter7.views import personForm one=personForm(name:張三,age:25)#用初始化數(shù)據(jù),創(chuàng)建模型表單對象 one.save()#保存表單 d=person.o

31、bjects.all()0#獲取數(shù)據(jù)庫中的第1條記錄, ,d.age#查看數(shù)據(jù)(張三, 25)調(diào)用save()方法時,會將數(shù)據(jù)寫入數(shù)據(jù)庫,同時返回包含數(shù)據(jù)的模型對象。第40頁,共55頁。4使用模型表單修改數(shù)據(jù)庫記錄在創(chuàng)建模型表單對象時,可使用instance參數(shù)指定模型對象,save()方法使用模型表單的數(shù)據(jù)修改模型對象,從而修改其關(guān)聯(lián)的數(shù)據(jù)庫記錄,示例代碼如下。 p=person.objects.get(id=1) #獲取模型對象 ,p.age#查看數(shù)據(jù)(張三, 25) one=personForm(name:李四,age:30,instance=p)#創(chuàng)建關(guān)聯(lián)模型對

32、象的模型表單 one.save()#保存表單 p=person.objects.get(id=1) ,p.age #通過模型對象查看修改后的數(shù)據(jù)(李四, 30)第41頁,共55頁。7.3.2在視圖中使用模型表單在視圖中,可用request.POST作為參數(shù)來創(chuàng)建模型表單對象,再通過模型表單對象將數(shù)據(jù)添加到數(shù)據(jù)庫或者修改現(xiàn)有記錄視圖在使用POST方法請求時,視圖通過request.POST獲得客戶端提交的數(shù)據(jù)。將request.POST作為參數(shù)初始化表單,執(zhí)行表單驗證操作,可檢查數(shù)據(jù)是否有效。在數(shù)據(jù)有效時,用客戶端提交的姓名作為條件執(zhí)行查詢。當(dāng)數(shù)據(jù)庫中不存在相同姓名時,執(zhí)行表單保存操

33、作,將數(shù)據(jù)寫入數(shù)據(jù)庫。在瀏覽器中訪問視圖URL時,請求方法為GET,此時視圖返回空白表單。第42頁,共55頁。def usePersonForm(request): if request.method = POST: #提交表單時采用POST方法,此時處理數(shù)據(jù) mform = personForm(request.POST)#用提交的數(shù)據(jù)初始化表單 if mform.is_valid():#在表單通過驗證時執(zhí)行數(shù)據(jù)處理 ps=person.objects.filter(name=request.POSTname) #用表單數(shù)據(jù)查詢 if ps.count()=0: mform.save()#不

34、存在相同姓名時,將數(shù)據(jù)添加到數(shù)據(jù)庫 msg=數(shù)據(jù)已保存! else: msg=數(shù)據(jù)庫已存在相同姓名的數(shù)據(jù),請勿重復(fù)提交! else: mform = personForm()#創(chuàng)建空白表單 msg=請輸入數(shù)據(jù)添加新記錄return render(request, temmodelform.html, mform: mform,msg:msg)第43頁,共55頁。7.3.3自定義模型表單字段通常情況下,模型表單字段與模型字段保持一致。Django允許在模型表單中覆蓋模型字段定義第44頁,共55頁。def validate_age(value):#自定義校驗函數(shù) if int(value) 50:

35、 raise ValidationError(年齡不能大于50!,code=max_value)class personFormDIY(ModelForm):#定義模型表單 #重定義age字段 age=forms.CharField(validators=validate_age,label=年齡, widget = forms.NumberInput(), help_text = 年齡為20,50以內(nèi)的整數(shù)) class Meta: model = person #指定模型 fields = name, age #指定字段 labels = name: 姓名, #設(shè)置字段渲染后的內(nèi)容 hel

36、p_texts = name:姓名為中英文字符串,#設(shè)置字段幫助文本 widgets = name: forms.Textarea(attrs=cols: 30, rows: 2),#設(shè)置字段小部件第45頁,共55頁。7.4 資源資源指應(yīng)用于表單的CSS和JavaScript文件。當(dāng)定義表單或小部件時,可以在Media子類中為其定義資源。在渲染表單時,Django會將資源文件包含到HTML中。本節(jié)主要內(nèi)容小部件資源表單資源第46頁,共55頁。7.4.1小部件資源通過擴展小部件定義表單資源的基本格式如下。class 自定義小部件類名稱(forms.內(nèi)置小部件類名稱): class Media: css=設(shè)備類型: (CSS資源文件URL,), js

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論