因为想在博客页面添加一个博客的创建时间和最后的修改时间,所以首先想到的是在模型类里面定义两个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都会自动更新时间:
修改博文之后