【问题标题】:How to replace `created_at` field with `updated_at` field in templates when a post is updated?更新帖子时如何将模板中的“created_at”字段替换为“updated_at”字段?
【发布时间】:2019-09-30 00:53:03
【问题描述】:

我有以下模型,其中分别是 created_atupdated_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,你能帮我做这件事吗?非常感谢!

【问题讨论】:

  • 我认为你可以应用一个简单的检查来查看 createdOn 和 UpdatedOn 是否相同,如果相同则只显示 createdOn
  • 是的,它按预期工作。非常感谢@skaul05

标签: python django datetime model


【解决方案1】:

如果您将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 标志,而不是依赖于跨平台可能不一致的数学。

【讨论】:

  • 谢谢@kungphu,我可以通过在模型中设置null=True 使updated_at 为空,但是当帖子更新时如何设置它?
  • 您可以手动将其设置为datetime.now()。您可以选择在哪里执行此操作,但一个简单的地方是注册pre_save 信号并在存在id 值时设置updated_at(意味着模型之前已保存,因此当前保存操作是由于更新)。
猜你喜欢
  • 2012-04-19
  • 2023-04-07
  • 2022-01-04
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多