【问题标题】:How to create a timestamp on submit in Django class based views for Update?如何在基于 Django 类的更新视图中创建提交时间戳?
【发布时间】:2017-08-03 18:10:09
【问题描述】:

我是 Django 中基于类的视图的新手,并且使用的是简单的 UpdateView CBV。视图有许多显示在模板上的字段,除了一个; Date field。如何在此字段中添加时间戳?只有在第一次创建对象时才应添加时间戳。从下一次开始,它应该只显示第一次添加的时间戳。这是我的代码:

class ReviewsEdit(UpdateView):
    model = ProductReview
    fields = ['title', 'body', 'score', 'responder_name', 'response']     
    template_name = 'review_system/review_edit.html'
    context_object_name = 'review'

ProductReview 模型具有上述所有字段和另一个日期字段,我想在单击提交按钮时将其与时间戳数据一起保存 - 仅当提交时为空白时。 CBV 可以做到这一点吗?

【问题讨论】:

  • 你的问题不是很清楚,你想保留上次更新对象的时间戳吗?如果评论更新了,您要保存更新发生的时间戳吗?
  • 为什么只有空白才想保存?它甚至应该是可编辑的吗?
  • 对不起,是的,不是的,我只想保留一个时间戳,一个在创建对象时创建的时间戳。此后对对象的任何修改都只会显示第一个时间戳,不会更新
  • @Risadinha 它不应该是可编辑的,这就是它没有显示在模板中的原因。

标签: python django django-class-based-views


【解决方案1】:

如果您想实现让您知道对象创建和/​​或上次编辑时间的字段,您可以使用这些 Django 字段来实现:

class TouchStampModel(Model):
    created = DateTimeField(auto_now_add=True, editable=False, null=False, blank=False)
    last_modified = DateTimeField(auto_now=True, editable=False, null=False, blank=False)

    class Meta:
        abstract = True

任何模型子类都将具有这些字段,默认情况下它们将不可编辑(不会显示在用于编辑的表单中),last_modified 将在每次数据库更新时自动更新,而 created 将被设置到数据库插入时间。

当然,您可以修改现有模型的 DateTimeField。除非您有多个需要 createdlast_modified 的模型,否则不需要超类。

【讨论】:

  • 现在检查我的问题,它仍然令人困惑吗?让我知道它是否是
【解决方案2】:
  class ReviewModel(Model):
       created_at = DateTimeField(auto_now_add=True, editable=False, null=False, blank=False)

那你为什么不在模板上显示呢。

obj.created_at

这将始终显示评论的创建时间

【讨论】:

  • 这个会告诉我整个模型是什么时候创建的,对吧?那么如果一个模型有很多字段,我是否也可以知道各个字段是何时使用同一行代码创建的?
  • 说你有 user, body, rating 作为模型字段的一部分,你想知道每个是什么时候创建的......据我所知,没有,因为它们都同时组合到形成对象。
【解决方案3】:

我明白了,我必须重写 save() 方法才能完成它。它的工作原理是这样的。定义模型后,覆盖 save() 方法。

def save(self, *args, **kwargs):
 if not self.your.field:
        self.date_field = datetime.datetime.now()
 super(ModelName, self).save(*args, **kwargs)

【讨论】:

  • 什么是your.field
  • 哦,your.field 是读者想要操作的任何字段。我想如果我的回答太具体,社区可能会抱怨,所以我把它写得有点笼统。
  • 这样的代码被破坏了。将其更改为self.your_field。所以这就是你问题的答案。可能会使问题更清楚一点,但用例(以及需要这种 hack 而不是使用 auto_add_now)对我来说仍然有点神秘。
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2021-02-04
  • 2016-12-29
  • 1970-01-01
相关资源
最近更新 更多