国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解Django中的form庫的使用

2019-11-25 17:10:10
字體:
來源:轉載
供稿:網友

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類。 在這個例子中,我們只有一個`` <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 f<tr><th><label for="id_subject">Subject:</label></th><td><input type="text" name="subject" id="id_subject" /></td></tr><tr><th><label for="id_email">Email:</label></th><td><input type="text" name="email" id="id_email" /></td></tr><tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr>

為了便于訪問,Django用`` <label>`` 標志,為每一個字段添加了標簽。 這個做法使默認行為盡可能合適。

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

>>> print f.as_ul()<li><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></li><li><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></li><li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li>>>> print f.as_p()<p><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></p><p><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></p><p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>

請注意,標簽<table>、<ul>、<form>的開閉合標記沒有包含于輸出當中,這樣你就可以添加額外的行或者自定義格式。

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

>>> print f['subject']<input type="text" name="subject" id="id_subject" />>>> print f['message']<input type="text" name="message" id="id_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型對象。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沅江市| 广灵县| 扶风县| 高邑县| 鄯善县| 大埔县| 哈密市| 集安市| 营口市| 沙田区| 屏山县| 新蔡县| 南阳市| 大埔县| 大名县| 子长县| 汨罗市| 库伦旗| 犍为县| 绥芬河市| 丰宁| 井冈山市| 东乡族自治县| 页游| 开平市| 观塘区| 乌兰浩特市| 乡城县| 丰原市| 喀喇沁旗| 永新县| 奉新县| 徐州市| 铜山县| 库伦旗| 中江县| 永吉县| 成都市| 湖口县| 盐亭县| 庆阳市|