Django模型表单对象的自动创建日期
怎样才能自动为一个对象设置创建日期,同时还要有一个字段记录这个对象最后一次更新的时间呢?
models.py:
created_at = models.DateTimeField(False, True, editable=False)
updated_at = models.DateTimeField(True, True, editable=False)
views.py:
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user
obj.save()
return HttpResponseRedirect('obj_list')
我遇到了这个错误:
objects_object.created_at may not be NULL
我是不是需要自己手动设置这个值?我以为传给DateTimeField
的参数就是为了这个(还是说这些参数只是默认值,因为我设置了editable=False
,所以它们在表单中不显示,结果也就没被提交到请求中,因此没有被放到表单里?)。
这样做的最佳方法是什么呢?用一个__init__
方法吗?
2 个回答
115
其实,上面的回答是对的,auto_now_add 和 auto_now 可以解决这个问题。不过,最好是创建一个抽象类,这样在需要 created_at
和 updated_at
字段的模型里都可以使用。
class TimeStampMixin(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
这样的话,你只需要简单地继承这个抽象类,就可以在你创建的任何模型中使用时间戳了。
class Posts(TimeStampMixin):
name = models.CharField(max_length=50)
...
...
通过这种方式,你可以利用面向对象的可重用性,这在Django中符合DRY原则(不要重复自己)。
478
你可以使用 auto_now
和 auto_now_add
这两个选项,分别来设置 updated_at
和 created_at
的时间。
class MyModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)