Django中的日期和時間格式 DateTimeField

創建django的model時,有DateTimeField、DateField和TimeField三種類型可以用來創建日期字段,其值分別對應着datetime()、date()、time()三中對象。這三個field有着相同的參數auto_now和auto_now_add,表面上看起來很easy,但實際使用中很容易出錯,下面是一些注意點。

DateTimeField.auto_now

這個參數的默認值爲false,設置爲true時,能夠在保存該字段時,將其值設置爲當前時間,並且每次修改model,都會自動更新。因此這個參數在需要存儲“最後修改時間”的場景下,十分方便。需要注意的是,設置該參數爲true時,並不簡單地意味着字段的默認值爲當前時間,而是指字段會被“強制”更新到當前時間,你無法程序中手動爲字段賦值;如果使用django再帶的admin管理器,那麼該字段在admin中是隻讀的。

DateTimeField.auto_now_add

這個參數的默認值也爲False,設置爲True時,會在model對象第一次被創建時,將字段的值設置爲創建時的時間,以後修改對象時,字段的值不會再更新。該屬性通常被用在存儲“創建時間”的場景下。與auto_now類似,auto_now_add也具有強制性,一旦被設置爲True,就無法在程序中手動爲字段賦值,在admin中字段也會成爲只讀的。

id="iframe_0.9560138338711113" src="https://www.cnblogs.com/show-blocking-image.aspx?url=http%3A%2F%2Fwww.nanerbang.com%2Fmedia%2Farticle_images%2F2015%2F06%2F27%2Fqq20150627112737.png&maxWidth=1261&origin=http://www.cnblogs.com&iframeId=iframe_0.9560138338711113" frameborder="0" scrolling="no" height="298" style="border-style: none; border-width: initial; width: 1261px;">

admin中的日期時間字段

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

class YourAdmin(admin.ModelAdmin):
    readonly_fields = ('save_date', 'mod_date',)
admin.site.register(Tag, YourAdmin)

如何將創建時間設置爲“默認當前”並且可修改

那麼問題來了。實際場景中,往往既希望在對象的創建時間默認被設置爲當前值,又希望能在日後修改它。怎麼實現這種需求呢?

django中所有的model字段都擁有一個default參數,用來給字段設置默認值。可以用default=timezone.now來替換auto_now=True或auto_now_add=True。timezone.now對應着django.utils.timezone.now(),因此需要寫成類似下面的形式:

from django.db import models
import django.utils.timezone as timezone
class Doc(models.Model):
    add_date = models.DateTimeField('保存日期',default = timezone.now)
    mod_date = models.DateTimeField('最後修改日期', auto_now = True


 

html頁面從數據庫中讀出DateTimeField字段時,顯示的時間格式和數據庫中存放的格式不一致,比如數據庫字段內容爲2016-06-03 13:00:00,但是頁面顯示的卻是Apr. 03, 2016, 1 p.m.

爲了頁面和數據庫中顯示一致,需要在頁面格式化時間,需要添加<td>{{ infor.updatetime|date:"Y-m-d H:i:s" }}</td> 類似的過濾器。刷新頁面,即可正常顯示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章