Django顯示建立時間和修改時間
阿新 • • 發佈:2019-01-03
因為想在部落格頁面新增一個部落格的建立時間和最後的修改時間,所以首先想到的是在模型類裡面定義兩個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_now
和auto_now_add
被設定為True
後,會導致其欄位屬性editable=False
和blank=True
的狀態。editable=False
將導致欄位不會被呈現在admin中,blank=Ture
表示允許在表單中不輸入值。也就是說,這兩個欄位不能被手動修改覆蓋,auto_now
在每次呼叫Model.save()
時,都會強制更新,而auto_now_add
建立了第一次時間戳之後不會再變化,均為只讀狀態。那如何解決同時顯示建立時間和更新時間的需求呢?
一個辦法是不使用
auto_now
和auto_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都會自動更新時間:
修改博文之後