【问题标题】:FieldError: Unknown field(s) (created_at, modified_at) specified for AccountFieldError:为帐户指定的未知字段(created_at、modified_at)
【发布时间】:2017-05-23 14:27:49
【问题描述】:

我正在尝试为我的模型 Account 创建一个时间戳,但我不希望我的两个时间戳(created_atmodified_at)可以被用户编辑甚至查看。在我将editable=False 添加到created_atmodified_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',)

这是我尝试做任何事情(迁移、运行服务器等)时遇到的模糊错误:

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']

【问题讨论】:

  • 请显示完整的回溯。
  • 添加了完整的回溯。
  • 回溯显示错误发生在您的AccountForm中,您没有显示。
  • 嗯,好的,我也添加了我的 AccountForm。
  • Django 不允许您在模型表单中包含带有editable=False 的字段。您应该删除 editable=False 或从模型表单中删除它们。

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


【解决方案1】:

你可以这样做,

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 错误消息键。

【讨论】:

  • 这两个都绘制​​了与我添加 editable=False 时相同的错误:django.core.exception.FieldError: Unknown field(s) (created_at, modified_at) specified for Account
  • @Logicman 确保删除您的 save() 方法覆盖。
  • 希望你得到你想要的东西!
  • auto_add_nowauto_add 听起来正是我想要的。但是我现在收到错误消息:TypeError: __init__() got an unexpected keyowrd argument 'auto_add'。有什么想法吗?
  • 抱歉,我的错误不是 auto_add,而是 auto_now...我现在将编辑答案..
猜你喜欢
  • 2018-02-27
  • 2014-07-31
  • 2014-01-03
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多