W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
所有表單類都作為 ?django.forms.Form
? 或者 ?django.forms.ModelForm
? 的子類來創(chuàng)建。您可以把 ?ModelForm
?想象成 ?Form
?的子類。實際上 ?Form
?和 ?ModelForm
?從(私有) ?BaseForm
?類繼承了通用功能,但是這個實現(xiàn)細節(jié)不怎么重要。
實際上,如果您的表單是要直接用來添加或編輯Django模型,用 ?ModelForm
?,可以省時、省力、省代碼,因為它會根據(jù) Model 類構建一張對應字段及其屬性的表單。
未綁定的表單沒有與其關聯(lián)的數(shù)據(jù)。當渲染給用戶的時候,它會是空的或者包含默認值。
綁定的表單擁有已提交的數(shù)據(jù),因此可以用來判斷數(shù)據(jù)是否合法。如果渲染了一張非法的綁定的表單,它將包含內聯(lián)的錯誤信息,告知用戶要糾正哪些數(shù)據(jù)。
表單的 ?is_bound
?屬性將告訴您一張表單是否具有綁定的數(shù)據(jù)。
考慮一下比我們上面的小示例更有用的一張表單,我們可以用它在個人網(wǎng)站上實現(xiàn)“聯(lián)系我”的功能:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
我們之前的表單只用了一個 ?CharField
?類型的字段 ?your_name
?。在這個例子中,我們的表單有四個字段: ?subject
?、 ?message
?、 ?sender
?和 ?cc_myself
?。只用到三種可用的字段類型: ?CharField
?、 ?EmailField
?和 ?BooleanField
?。
每個表單字段都有一個相對應的 控件類 ,這個控件類又有對應的HTML表單控件,比如 ?<input type="text">
? 。
多數(shù)情況下,字段都有合適的默認控件。比如,默認情況下, ?CharField
?有個 ?TextInput
?控件,它會在HTML中生成一個 ?<input type="text">
? 。如果您想要的是 ?<textarea>
? ,您要在定義表單字段的時候指定控件,就像我們對 ?message
?字段那樣處理。
無論用表單提交了什么數(shù)據(jù),一旦通過調用 ?is_valid()
? 驗證成功( ?is_valid()
? 返回 ?True
?),已驗證的表單數(shù)據(jù)將被放到 ?form.cleaned_data
? 字典中。這里的數(shù)據(jù)已經很好的為你轉化為Python類型。
注解:此時您依然能夠直接從 ?request.POST
? 中訪問到未驗證的數(shù)據(jù),但最好還是使用經驗證的數(shù)據(jù)。
在上面的聯(lián)系表單示例中, ?cc_myself
?會被轉化成一個布爾值。同樣的,字段 ?IntegerField
?和 ?FloatField
?的值分別會被轉化為Python的 ?int
?和 ?float
?類型。
下面例舉了如何在視圖中處理表單數(shù)據(jù):
from django.core.mail import send_mail
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']
recipients = ['info@example.com']
if cc_myself:
recipients.append(sender)
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect('/thanks/')
有些字段類型需要一些額外的處理。例如,使用表單上傳文件就要以不同的方式處理(它們可以從 ?request.FILES
? 獲取,而不是 ?request.POST
? 中)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: