我有以下模型,其中分别是created_at
和updated_at
字段:
class BlogPost(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
slug = models.SlugField(blank=True, unique=True)
image = models.ImageField(default='default.jpg',upload_to='posts/%Y/%m/%d')
created_at = models.DateTimeField(blank=True, null=True, auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
我希望它仅显示Posted now
文本(当前时间),并且只有当我更新该字段时,它才应显示Updated now
文本。
这是上面模板的html:
<small class="text-secondary">Posted {{ object.created_at|naturaltime }}</small><br>
<small class="text-secondary">Updated {{ object.updated_at|naturaltime }}</small><br>
我不知道是否要更改我的model
或在模板中使用某些if conditions
,请您帮帮我吗?非常感谢你!
答案 0 :(得分:0)
如果您将updated_at
设置为可空,并且仅在帖子更新后进行设置,则对updated_at
进行空检查将是确定帖子是否已更新的简便可靠的方法。
<small class="text-secondary">
{% if object.updated_at %}
Updated {{ object.updated_at|naturaltime }}
{% else %}
Posted {{ object.created_at|naturaltime }}
{% endif %}
</small><br>
但是,由于始终设置updated_at
(包括创建时),因此针对created_at
可能的相等性检查会起作用。但是,如果尝试这样做,则应仔细检查以查看这些日期时间是否总是总是完全相等。该检查是否真正有效取决于这两个值的生成方式和时间。
如果您不确定100%是否匹配日期时间,则可能需要选择一个较小的增量,以便合理地猜测帖子是否已更新。
def updated(self):
return (self.updated_at - self.created_at) < timedelta(microseconds=100)
我认为您最好将模型上的updated_at
设为空或保留updated
标志,而不要依赖于在各个平台上可能不一致的数学。