1. 程式人生 > >Django顯示建立時間和修改時間

Django顯示建立時間和修改時間

因為想在部落格頁面新增一個部落格的建立時間和最後的修改時間,所以首先想到的是在模型類裡面定義兩個DateTimeField欄位,一個使用auto_now_add(第一次建立模型類時新增,以後不再改動),另一個使用auto_now(新增或者最後一次修改該模型時的時間):

    create_timestamp = models.DateTimeField(auto_now_add=True) 
    last_edit_timestamp = models.DateTimeField(auto_now=True)

但是在遷移檔案的時候發現第二個時間戳欄位last_edit_timestamp

並沒有在資料庫裡面創建出來,遂上網查資料,得知:
auto_nowauto_now_add被設定為True後,會導致其欄位屬性editable=Falseblank=True的狀態。editable=False將導致欄位不會被呈現在admin中,blank=Ture表示允許在表單中不輸入值。也就是說,這兩個欄位不能被手動修改覆蓋,auto_now在每次呼叫Model.save()時,都會強制更新,而auto_now_add建立了第一次時間戳之後不會再變化,均為只讀狀態。
那如何解決同時顯示建立時間和更新時間的需求呢?
一個辦法是不使用auto_nowauto_now_add屬性,重寫model.save
方法,模型類定義如下:

    class BlogPost(models.Model):
        title = models.CharField(max_length=150,verbose_name='標題')
        body = models.TextField(verbose_name='正文')
        create_timestamp = models.DateTimeField()
        last_edit_timestamp = models.DateTimeField(default=datetime.now())
        is_delete =
models.BooleanField(default=0) class Meta: ordering = ('-create_timestamp',) def save(self, *args,**kwargs): if not self.id: self.create_timestamp = timezone.now() self.last_edit_timestamp = timezone.now() return super(BlogPost,self).save(*args,**kwargs)

模板顯示程式碼:

    {% for post in posts %}
            <h2>{{ post.title }}</h2>
            <p>{{ post.body }}</p>
            <p>建立時間:{{ post.create_timestamp|date:'Y-m-d H:i:s' }}</p>
            <p>最後編輯時間:{{ post.last_edit_timestamp|date:'Y-m-d H:i:s' }}</p>
            <a href="/blog/edit_page{{ post.id }}">編輯</a>
            <a href="/blog/delete{{ post.id }}">刪除</a>
            <hr>
        {% endfor %}

這樣當每次修改Blog內容時,last_edit_timestamp都會自動更新時間:
建立博文
修改博文之後
修改博文