FieldError:为Account指定的未知字段(created_at,modified_at)

时间:2017-05-23 14:27:49

标签: python django python-3.x django-models django-forms

我正在尝试为我的模型Account创建时间戳,但我不希望我的两个时间戳(created_atmodified_at)可以编辑,甚至可以通过用户。在editable=Falsecreated_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']

1 个答案:

答案 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错误消息密钥。