1. 程式人生 > >django:DateTimeField如何自動設置為當前時間並且能被修改 ——django日期時間字段的使用

django:DateTimeField如何自動設置為當前時間並且能被修改 ——django日期時間字段的使用

種類 log true 分享圖片 www. 技術分享 djang 默認值 http

創建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中字段也會成為只讀的。

技術分享圖片

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)

參考

http://www.nanerbang.com/article/5488/

django:DateTimeField如何自動設置為當前時間並且能被修改 ——django日期時間字段的使用