詳解Django中的form庫的使用

來源:互聯網
上載者:User
Django帶有一個form庫,稱為django.forms,這個庫可以處理我們本章所提到的包括HTML表單顯示以及驗證。 接下來我們來深入瞭解一下form庫,並使用她來重寫contact表單應用。

Django的newforms庫

在Django社區上會經常看到django.newforms這個詞語。當人們討論django.newforms,其實就是我們本章裡面介紹的django.forms。

改名其實有曆史原因的。 當Django一次向公眾發行時,它有一個複雜難懂的表單系統:django.forms。後來它被完全重寫了,新的版本改叫作:django.newforms,這樣人們還可以通過名稱,使用舊版本。 當Django 1.0發布時,舊版本django.forms就不再使用了,而django.newforms也終於可以名正言順的叫做:django.forms。

表單架構最主要的用法是,為每一個將要處理的HTML的``

`` 定義一個Form類。 在這個例子中,我們只有一個`` `` ,因此我們只需定義一個Form類。 這個類可以存在於任何地方,甚至直接寫在`` views.py`` 檔案裡也行,但是社區的慣例是把Form類都放到一個檔案中:forms.py。在存放`` views.py`` 的目錄中,建立這個檔案,然後輸入:

from django import formsclass ContactForm(forms.Form):  subject = forms.CharField()  email = forms.EmailField(required=False)  message = forms.CharField()

這看上去簡單易懂,並且很像在模組中使用的文法。 表單中的每一個欄位(域)作為Form類的屬性,被展現成Field類。這裡只用到CharField和EmailField類型。 每一個欄位都預設是必填。要使email成為可選項,我們需要指定required=False。

讓我們鑽研到Python解譯器裡面看看這個類做了些什麼。 它做的第一件事是將自己顯示成HTML:

>>> from contact.forms import ContactForm>>> f = ContactForm()>>> print fSubject:Email:Message:

為了便於訪問,Django用`` `` 標誌,為每一個欄位添加了標籤。 這個做法使預設行為儘可能合適。

預設輸出按照HTML的<`` table`` >格式,另外有一些其它格式的輸出:

>>> print f.as_ul()
  • Subject:
  • Email:
  • Message:
  • >>> print f.as_p()

    Subject:

    Email:

    Message:

    請注意,標籤

      、的開閉合標記沒有包含於輸出當中,這樣你就可以添加額外的行或者自訂格式。

      這些類方法只是一般情況下用於快捷顯示完整表單的方法。 你同樣可以用HTML顯示個別欄位:

      >>> print f['subject']>>> print f['message']

      Form對象做的第二件事是校正資料。 為了校正資料,我們建立一個新的對Form象,並且傳入一個與定義匹配的字典類型資料:

      >>> f = ContactForm({'subject': 'Hello', 'email': 'adrian@example.com', 'message': 'Nice site!'})

      一旦你對一個Form實體賦值,你就得到了一個綁定form:

      >>> f.is_boundTrue

      調用任何綁定form的is_valid()方法,就可以知道它的資料是否合法。 我們已經為每個欄位傳入了值,因此整個Form是合法的:

      >>> f.is_valid()True

      如果我們不傳入email值,它依然是合法的。因為我們指定這個欄位的屬性required=False:

      >>> f = ContactForm({'subject': 'Hello', 'message': 'Nice site!'})>>> f.is_valid()True

      但是,如果留空subject或message,整個Form就不再合法了:

      >>> f = ContactForm({'subject': 'Hello'})>>> f.is_valid()False>>> f = ContactForm({'subject': 'Hello', 'message': ''})>>> f.is_valid()False

      你可以逐一查看每個欄位的出錯訊息:

      >>> f = ContactForm({'subject': 'Hello', 'message': ''})>>> f['message'].errors[u'This field is required.']>>> f['subject'].errors[]>>> f['email'].errors[]

      每一個邦定Form實體都有一個errors屬性,它為你提供了一個欄位與錯誤訊息相映射的字典表。

      >>> f = ContactForm({'subject': 'Hello', 'message': ''})>>> f.errors{'message': [u'This field is required.']}

      最終,如果一個Form實體的資料是合法的,它就會有一個可用的cleaned_data屬性。 這是一個包含乾淨的提交資料的字典。 Django的form架構不但校正資料,它還會把它們轉換成相應的Python類型資料,這叫做清理資料。

      >>> f = ContactForm({subject': Hello, email: adrian@example.com, message: Nice site!})>>> f.is_valid()True>>> f.cleaned_data{message': uNice site!, email: uadrian@example.com, subject: uHello}

      我們的contact form只涉及字串類型,它們會被清理成Unicode對象。如果我們使用整數型或日期型,form架構會確保方法使用合適的Python整數型或datetime.date型對象。

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.