欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django中日期處理注意事項與自定義時間格式轉(zhuǎn)換詳解

 更新時間:2018年08月06日 11:31:09   作者:Jx戰(zhàn)壕  
這篇文章主要給大家介紹了關(guān)于Django中日期處理注意事項與自定義時間格式轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

我們在用Django創(chuàng)建models時,常常會涉及時間日期字段的處理,Django里日期相關(guān)Field有DateTimeField、DateField和TimeField三種類型,看似簡單,但其中有一些容易出錯的地方需要注意;另外,如果不習(xí)慣Django的默認時間格式,也可以自定義的修改。

DateTimeField、DateField和TimeField,其值分別對應(yīng)著Python里的datetime.datetime、datetime.date和datetime.time三個實例,這三個Field里都有兩個參數(shù):auto_now和auto_now_add,默認值均為False。

auto_now參數(shù)說明:

每次保存對象時自動將字段值設(shè)置為當(dāng)前時間,能夠在保存該字段時,將其值設(shè)置為當(dāng)前時間,并且每次修改model,都會自動更新。因此這個參數(shù)在需要存儲“最后修改時間”的場景下,十分方便,常用類似“l(fā)ast-modified”或者"update_time"字段。

需要注意的是,該字段不能被手動修改覆蓋;當(dāng)設(shè)置為true時,只有每次調(diào)用Model.save()時,才會強制更新為當(dāng)前時間點;當(dāng)用其他方式更新其他字段時并不會更新:比如用QuerySet.update()方法,即使為該字段指定一個自定義的值,該字段也不會有所更改。比較直觀的表現(xiàn)形式是,如果使用django自帶的admin管理器,那么該字段在admin中是只讀的,并且無法進行修改。

示例代碼如下:

class Datacenter(models.Model):
 id = models.UUIDField('機房ID', default=uuid.uuid4, primary_key=True)
 zone = models.ForeignKey(Zone, verbose_name='所在區(qū)域', on_delete=models.PROTECT)
 dc_name = models.CharField('機房', max_length=128, unique=True)
 networks = models.CharField('IP地址段', max_length=128, blank=True, unique=True)
 update_time = models.DateTimeField('更新時間', auto_now=True)

 def __str__(self):
 return self.dc_name

 class Meta:
 verbose_name = '機房配置'
 verbose_name_plural = '機房配置'

Datacenter的ModelAdmin代碼:

class DatacenterAdmin(admin.ModelAdmin):
 list_display = ['id', 'dc_name', 'zone', 'networks', 'update_time']
 search_fields = ['dc_name', 'zone', 'networks']
 list_filter = ['dc_name', 'zone']
 ordering = ['networks', 'zone']
admin.site.register(models.Datacenter, DatacenterAdmin)

Admin界面效果圖:

點擊編輯頁面,會發(fā)現(xiàn)找不到‘更新時間'的編輯處,因為此字段是只讀,且不允許手動修改,效果圖如下:


當(dāng)頁面“save”之后,再觀察現(xiàn)在的‘更新時間'發(fā)現(xiàn)時間已經(jīng)被修改:


auto_now_add參數(shù)說明:

設(shè)置為True時,會在model對象第一次被創(chuàng)建時,將字段的值設(shè)置為創(chuàng)建時的時間,以后修改對象時,字段的值不會再更新。該屬性通常被用在存儲“創(chuàng)建時間”的場景下。與auto_now類似,auto_now_add也具有強制性,一旦被設(shè)置為True,就無法在程序中手動為字段賦值,在admin中字段也會成為只讀的。

繼續(xù)沿用剛才的代碼示例,'update_time'的'auto_now'改完'auto_now_add',其他代碼不變:

class Datacenter(models.Model):
 id = models.UUIDField('機房ID', default=uuid.uuid4, primary_key=True)
 zone = models.ForeignKey(Zone, verbose_name='所在區(qū)域', on_delete=models.PROTECT)
 dc_name = models.CharField('機房', max_length=128, unique=True)
 networks = models.CharField('IP地址段', max_length=128, blank=True, unique=True)
 update_time = models.DateTimeField('更新時間', auto_now_add=True)

編輯更新北京聯(lián)通機房的IP地址段之后保存:


更改之后‘更新時間'并未發(fā)生改變(見下圖),因為‘a(chǎn)uto_now_add'在對象創(chuàng)建完成后即不再更新:

如何實現(xiàn)可編輯

auto_now和auto_now_add被設(shè)置為True后,這樣做會導(dǎo)致字段成為editable=False和blank=True的狀態(tài)。editable=False將導(dǎo)致字段不會被呈現(xiàn)在admin中,blank=Ture表示允許在表單中不輸入值。此時,如果在admin的fields或fieldset中強行加入該日期時間字段,那么程序會報錯,admin無法打開;如果在admin中修改對象時,想要看到日期和時間,可以將日期時間字段添加到admin類的readonly_fields中:

readonly_fields = ('save_date', 'mod_date',)

那么問題來了。實際場景中,往往既希望在對象的創(chuàng)建時間默認被設(shè)置為當(dāng)前值,又希望能在日后修改它。怎么實現(xiàn)這種需求呢?

django中所有的model字段都擁有一個default參數(shù),用來給字段設(shè)置默認值??梢杂胐efault=timezone.now來替換auto_now=True或auto_now_add=True。timezone.now對應(yīng)著django.utils.timezone.now(),代碼示例:

from django.utils import timezone

class Datacenter(models.Model):
 id = models.UUIDField('機房ID', default=uuid.uuid4, primary_key=True)
 zone = models.ForeignKey(Zone, verbose_name='所在區(qū)域', on_delete=models.PROTECT)
 dc_name = models.CharField('機房', max_length=128, unique=True)
 networks = models.CharField('IP地址段', max_length=128, blank=True, unique=True)
 update_time = models.DateTimeField('更新時間', default=timezone.now())

 def __str__(self):
  return self.dc_name

 class Meta:
  verbose_name = '機房配置'
  verbose_name_plural = '機房配置'

這里'update_time'字段默認值改為timezone.now()后,再次編輯已經(jīng)能看到相應(yīng)‘更新時間'字段,并且可修改:


我們把時間天數(shù)加1天后,保存退出再觀察‘更新時間'已經(jīng)變?yōu)樽远x時間:

自定義日期格式:
剛創(chuàng)建的Django應(yīng)用,可能你看到的日期顯示格式跟下圖類似(跟LANGUAGE_CODE和TIME_ZONE有關(guān)):

![可能的默認日期格式](http://i2.51cto.com/images/blog/201803/23/164dc709843a56536c09c9142775a553.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

如果不習(xí)慣這種格式,自己定義顯示格式的配置如下,更改Django的setting.py文件:

USE_L10N = False
DATE_FORMAT = 'Y-m-d'
DATETIME_FORMAT = 'Y-m-d H:i:s'

注意事項:如果USE_L10N設(shè)置為了True,那么語言環(huán)境規(guī)定的格式具有更高的優(yōu)先級并將被應(yīng)用,即DATE_FORMAT不生效。

這里可用的格式化字符串的其他寫法參見Django官方文檔:

<https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#date>;


另外在Django頁面渲染的時候,html頁面從數(shù)據(jù)庫中讀出DateTimeField字段時,顯示的時間格式和數(shù)據(jù)庫中存放的格式不一致,另外一個解決辦法:可以在頁面格式化時間,添加{{ Datacenter.updatetime|date:"Y-m-d H:i:s" }}類似的過濾器。之后刷新頁面,即可正常顯示。

相關(guān)文檔:

https://docs.djangoproject.com/en/2.0/ref/settings/

https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#std:templatefilter-date

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • python 利用百度API識別圖片文字(多線程版)

    python 利用百度API識別圖片文字(多線程版)

    這篇文章主要介紹了python 利用百度API識別圖片文字(多線程版),幫助大家更好的利用python進行機器識別,感興趣的朋友可以了解下
    2020-12-12
  • 一篇文章搞懂python混亂的切換操作與優(yōu)雅的推導(dǎo)式

    一篇文章搞懂python混亂的切換操作與優(yōu)雅的推導(dǎo)式

    這篇文章主要給大家介紹了如何通過一篇文章搞懂python混亂的切換操作與優(yōu)雅的推導(dǎo)式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-08-08
  • Python語言中Tuple的由來分析

    Python語言中Tuple的由來分析

    Tuple在Python中表示一種“大小固定的有序序列”,這篇文章主要介紹了Python語言中Tuple的由來,需要的朋友可以參考下
    2022-09-09
  • Python 動態(tài)導(dǎo)入對象,importlib.import_module()的使用方法

    Python 動態(tài)導(dǎo)入對象,importlib.import_module()的使用方法

    今天小編就為大家分享一篇Python 動態(tài)導(dǎo)入對象,importlib.import_module()的使用方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python實現(xiàn)隨機生成手機號及正則驗證手機號的方法

    Python實現(xiàn)隨機生成手機號及正則驗證手機號的方法

    這篇文章主要介紹了Python實現(xiàn)隨機生成手機號及正則驗證手機號的方法,涉及Python基于random模塊的隨機數(shù)以及基于re模塊的正則驗證相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • Python中8種運算符介紹以及示例

    Python中8種運算符介紹以及示例

    在Python編程中運算符是用于執(zhí)行各種操作的特殊符號或關(guān)鍵字,下面這篇文章主要給大家介紹了關(guān)于Python中8種運算符介紹以及示例的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • 如何更改jupyter的默認文件路徑

    如何更改jupyter的默認文件路徑

    這篇文章主要介紹了如何更改jupyter的默認文件路徑問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Python 高級專用類方法的實例詳解

    Python 高級專用類方法的實例詳解

    這篇文章主要介紹了Python 高級專用類方法的實例詳解的相關(guān)資料,希望通過本文大家能夠掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • python自動從arxiv下載paper的示例代碼

    python自動從arxiv下載paper的示例代碼

    這篇文章主要介紹了python自動從arxiv下載paper的示例代碼,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-12-12
  • tensorflow實現(xiàn)簡單的卷積網(wǎng)絡(luò)

    tensorflow實現(xiàn)簡單的卷積網(wǎng)絡(luò)

    這篇文章主要為大家詳細介紹了tensorflow實現(xiàn)簡單的卷積網(wǎng)絡(luò),使用的數(shù)據(jù)集是MNIST,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評論