我正在尝试为我的模型Account
创建时间戳,但我不希望我的两个时间戳(created_at
和modified_at
)可以编辑,甚至可以通过用户。在editable=False
和created_at
字段添加modified_at
之前,一切正常并且符合预期。这是我的模特:
class Account(models.Model):
account_name = models.CharField(max_length=25)
active = models.BooleanField(default=True)
created_at = models.DateTimeField(null=True, blank=True, editable=False)
modified_at = models.DateTimeField(null=True, blank=True, editable=False)
def save(self):
if self.id:
self.modified_at = datetime.datetime.now()
else:
self.created_at = datetime.datetime.now()
super(Account, self).save()
class Meta:
ordering = ('id',)
以下是我尝试执行任何操作时遇到的模糊错误(migrate,runserver等):
django.core.exception.FieldError: Unknown field(s) (created_at, modified_at) specified for Account
一旦从两个字段中删除editable=False
,一切正常。这是一个Django错误吗?是否有更好的方法使该字段不可由用户查看和不可编辑?
我正在使用Django 1.9和Python 3.6.1。感谢您的帮助,如果您需要我发布任何其他信息(视图,序列化器等),请告诉我。
修改
完整追溯:https://pastebin.com/YEQACX5z
帐户表格:
class AccountForm(ModelForm):
class Meta:
model = Account
fields = ['account_name', 'active', 'created_at', 'modified_at']
答案 0 :(得分:2)
你可以这么做,
created_at = models.DateTimeField(auto_now_add=True)
和
modified_at = models.DateTimeField(auto_now=True)
来自文档,
DateField.auto_now¶
每次保存对象时自动将字段设置为现在。对“最后修改”的时间戳有用。请注意,始终使用当前日期; 这不仅仅是您可以覆盖的默认值。
该字段仅在调用Model.save()时自动更新。使用其他方式(如QuerySet.update())更新其他字段时,不会更新该字段,但您可以在更新中为该字段指定自定义值。
DateField.auto_now_add¶
首次创建对象时自动将字段设置为现在。用于创建时间戳。请注意,始终使用当前日期; 这不仅仅是您可以覆盖的默认值。因此,即使您在创建对象时为此字段设置了值,也会将其忽略。
所以,不需要添加editable = False,它已经不可编辑了。
此外,请记住删除save()
方法覆盖,因为它正在尝试修改这些字段。
如果您希望能够修改此字段,请设置以下内容而不是auto_now_add = True:
For DateField: default=date.today - from datetime.date.today()
For DateTimeField: default=timezone.now - from django.utils.timezone.now()
此字段的默认表单窗口小部件是TextInput。管理员添加了一个JavaScript日历,以及“今天”的快捷方式。包含一个额外的invalid_date错误消息密钥。