python測試開發django-20.添加創建時間DateTimeField


前言

我們在admin后台發布一篇文章的時候,一般會有創建時間和最后更新時間這2個字段,創建時間就是第一次編輯文章的時候自動添加的,最后更新時間就是每次修改文章的內容后自動更新
在models.py建表的時候,設置creat_time和update_time類型為DateTimeField,添加auto_now_add和auto_now參數

DateTimeField

創建django的model時,有DateTimeField、DateField和TimeField三種類型可以用來創建日期字段,其值分別對應着datetime()、date()、time()三中對象。這三個field有着相同的參數auto_now和auto_now_add

auto_now_add 默認值為false

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

auto_now 默認值為false

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

在models.py下新建一個Article類,添加tile、body、auth、create_time、update_time字段。CharField是字符串類型,必須要有max_length參數,當正文的文本內容很多時,需使用TextField

class Article(models.Model):
    '''文章'''
    title = models.CharField(max_length=30)  # 標題
    body = models.TextField()                # 正文
    auth = models.CharField(max_length=10)   # 作者
    # 創建時間
    create_time = models.DateTimeField(auto_now_add=True)
    # 最后更新時間
    update_time = models.DateTimeField(auto_now=True)
    
    def __str__(self):
        return self.__doc__ + "title->" + self.title

當auto_now和auto_now_add被設置為True后,會導致其字段屬性editable=False和blank=True的狀態。editable=False將導致字段不會被呈現在admin中,blank=Ture表示允許在表單中不輸入值

admin.py注冊表

在admin.py添加注冊表的信息,然后執行下面兩句,同步數據庫

python manage.py makemigrations
python manage.py migrate

class ControlArticle(admin.ModelAdmin):
    # 顯示的字段
    list_display = ('title', 'body', 'auth', 'create_time', 'update_time')
    # 搜索條件
    search_fields = ('title',)
    
# 注冊Article表
admin.site.register(models.Article, ControlArticle)

amdin后台

打開admin后台,新增一條記錄

編輯標題、正文、作者之后保存

列表頁面顯示結果如下,如果重新編輯的話,最后更新時間也會更新

如果獲取的當前時間顯示和我們的時間相差八個小時,需要在setting.py設置 TIME_ZONE = 'Asia/Shanghai' ,參考前面的一篇https://www.cnblogs.com/yoyoketang/p/10342696.html

TIME_ZONE和USE_TZ

TIME_ZONE是設置時區,如果想獲取中國的當前,可以設置 TIME_ZONE = 'Asia/Shanghai',后面獲取當前時間會用到。
同時把USE_TZ設置為False,要不然數據庫的實際和當前系統時間不一致

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-Hans'    # 設置簡體中文,zh-Hant是繁體中文

# TIME_ZONE ='UTC'      # 時區
TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

# USE_TZ = True 
USE_TZ = False

修改完之后,在admin后台添加一條數據,時間就是當前時間,數據庫查詢到也是當前時間了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM