Django4.0 使用表單-詳解Django Form類

2022-03-16 17:58 更新

所有表單類都作為 ?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ù)

無論用表單提交了什么數(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? 中)。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號