欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python的Django框架中設置日期和字段可選的方法

系統 1612 0

設置字段可選

在擺弄了一會之后,你或許會發現管理工具有個限制:編輯表單需要你填寫每一個字段,然而在有些情況下,你想要某些字段是可選的。 舉個例子,我們想要Author模塊中的email字段成為可選,即允許不填。 在現實世界中,你可能沒有為每個作者登記郵箱地址。

為了指定email字段為可選,你只要編輯Book模塊(回想第五章,它在mysite/books/models.py文件里),在email字段上加上blank=True。代碼如下:

            
class Author(models.Model):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=40)
  email = models.EmailField(**blank=True** )


          

這些代碼告訴Django,作者的郵箱地址允許輸入一個空值。 所有字段都默認blank=False,這使得它們不允許輸入空值。

這里會發生一些有趣的事情。 直到現在,除了__unicode__()方法,我們的模塊充當數據庫中表定義的角色,即本質上是用Python的語法來寫CREATE TABLE語句。 在添加blank=True過程中,我們已經開始在簡單的定義數據表上擴展我們的模塊了。 現在,我們的模塊類開始成為一個富含Author對象屬性和行為的集合了。 email不但展現為一個數據庫中的VARCHAR類型的字段,它還是頁面中可選的字段,就像在管理工具中看到的那樣。

當你添加blank=True以后,刷新頁面Add author edit form (http://127.0.0.1:8000/admin/books/author/add/ ),將會發現Email的標簽不再是粗體了。 這意味它不是一個必填字段。 現在你可以添加一個作者而不必輸入郵箱地址,即使你為這個字段提交了一個空值,也再不會得到那刺眼的紅色信息“This field is required”。
設置日期型和數字型字段可選

雖然blank=True同樣適用于日期型和數字型字段,但是這里需要詳細講解一些背景知識。

SQL有指定空值的獨特方式,它把空值叫做NULL。NULL可以表示為未知的、非法的、或其它程序指定的含義。

在SQL中, NULL的值不同于空字符串,就像Python中None不同于空字符串("")一樣。這意味著某個字符型字段(如VARCHAR)的值不可能同時包含NULL和空字符串。

這會引起不必要的歧義或疑惑。 為什么這條記錄有個NULL,而那條記錄卻有個空字符串? 它們之間有區別,還是數據輸入不一致? 還有: 我怎樣才能得到全部擁有空值的記錄,應該按NULL和空字符串查找么?還是僅按字符串查找?

為了消除歧義,Django生成CREATE TABLE語句自動為每個字段顯式加上NOT NULL。 這里有個生成Author模塊的例子:

            
CREATE TABLE "books_author" (
  "id" serial NOT NULL PRIMARY KEY,
  "first_name" varchar(30) NOT NULL,
  "last_name" varchar(40) NOT NULL,
  "email" varchar(75) NOT NULL
)
;


          

在大多數情況下,這種默認的行為對你的應用程序來說是最佳的,因為它可以使你不再因數據一致性而頭痛。 而且它可以和Django的其它部分工作得很好。如在管理工具中,如果你留空一個字符型字段,它會為此插入一個空字符串(而* 不是*NULL)。

但是,其它數據類型有例外:日期型、時間型和數字型字段不接受空字符串。 如果你嘗試將一個空字符串插入日期型或整數型字段,你可能會得到數據庫返回的錯誤,這取決于那個數據庫的類型。 (PostgreSQL比較嚴禁,會拋出一個異常;MySQL可能會也可能不會接受,這取決于你使用的版本和運氣了。)在這種情況下,NULL是唯一指定空值的方法。 在Django模塊中,你可以通過添加null=True來指定一個字段允許為NULL。

因此,這說起來有點復雜: 如果你想允許一個日期型(DateField、TimeField、DateTimeField)或數字型(IntegerField、DecimalField、FloatField)字段為空,你需要使用null=True * 和* blank=True。

為了舉例說明,讓我們把Book模塊修改成允許 publication_date為空。修改后的代碼如下:

            
class Book(models.Model):
  title = models.CharField(max_length=100)
  authors = models.ManyToManyField(Author)
  publisher = models.ForeignKey(Publisher)
  publication_date = models.DateField(**blank=True, null=True** )


          

添加null=True比添加blank=True復雜。因為null=True改變了數據的語義,即改變了CREATE TABLE語句,把publication_date字段上的NOT NULL刪除了。 要完成這些改動,我們還需要更新數據庫。

出于某種原因,Django不會嘗試自動更新數據庫結構。所以你必須執行ALTER TABLE語句將模塊的改動更新至數據庫。 像先前那樣,你可以使用manage.py dbshell進入數據庫服務環境。 以下是在這個特殊情況下如何刪除NOT NULL:

            
ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;


          

(注意:以下SQL語法是PostgreSQL特有的。)

我們將在第十章詳細講述數據庫結構更改。

現在讓我們回到管理工具,添加book的編輯頁面允許輸入一個空的publication date。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费又粗又硬进去好爽A片视频 | 特黄特色的大片观看免费视频 | 国产精品成人一区二区 | 午夜a级片 | 九九久久99综合一区二区 | 成人av在线播放 | 亚洲精品一区国产 | 久久婷五月综合 | 日韩在线免费 | 日本a视频| 欧美日韩国产一区二区三区 | 久久视屏这里只有精品6国产 | 日日a.v拍夜夜添久久免费 | 三A级做爰片免费观看国产电影 | 黄视频网站在线看 | 色综合久久中文字幕网 | 国产精品成人不卡在线观看 | 美女福利视频国产免费观看 | 中文久久| 一区日韩 | 米奇精品一区二区三区在线观看 | 亚洲欧美中文日韩二区一区 | 免费在线观看www | 亚洲天堂免费视频 | 丁香花在线电影小说观看 | 久久一级视频 | 亚洲高清视频在线观看 | 欧美乱大交xxxx | 精品一区二区三区在线观看 | 嘿咻免费视频欧美激情 | 日本不卡一区二区 | 免费国产一区二区在免费观看 | 97国产在线播放 | 高清国产美女一级a毛片 | 久久综合图区亚洲综合图区 | 91精品国产综合久久久蜜臀粉嫩 | 欧美视频性 | 人人狠狠综合88综合久久 | 精品久久久久久久久久 | 一区二区成人国产精品 | 四虎1515hhhcom|