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都会自动更新时间:
创建博文
修改博文之后
修改博文

猜你喜欢

转载自blog.csdn.net/qq_40141862/article/details/85692755
今日推荐