DateTimeField不会显示在管理系统中

时间:2011-06-17 13:06:39

标签: python django django-admin admin

为什么我的“日期”字段没有出现在管理系统中?

在我的admin.py文件中,我有

from django.contrib import admin
from glasses.players.models import *
admin.site.register(Rating)

并且评级模型有一个名为“日期”的字段,如下所示

date = models.DateTimeField(editable=True, auto_now_add=True)

但是,在管理系统中,即使editable设置为True,该字段也不会显示。

有没有人有任何想法?

9 个答案:

答案 0 :(得分:170)

如果您真的想在管理面板中查看日期,可以在 admin.py 中添加readonly_fields

class RatingAdmin(admin.ModelAdmin):
    readonly_fields = ('date',)

admin.site.register(Rating,RatingAdmin)

您指定的任何字段都将在可编辑字段后最后添加。要控制订单,您可以使用fields选项。

可从Django docs获取更多信息。

答案 1 :(得分:44)

我相信推理auto_now_add字段的谎言。

来自this answer

  

具有auto_now属性的任何字段   set也将继承editable = False   因此不会出现在   管理小组。

the docs中也提到了

  

目前已实施,设定   auto_now或auto_now_add为True将   导致该字段具有editable = False   和空白=真实设置。

这确实有意义,因为如果在保存对象时当前日期时间将覆盖该字段,则没有理由让该字段可编辑。

答案 2 :(得分:21)

Major Hack:

如果你真的需要这样做(就像我一样),你可以随时通过immediatley将字段设置为“可编辑”来定义字段,如下所示:

class Point(models.Model):
  mystamp=models.DateTimeField("When Created",auto_now_add=True)
  mystamp.editable=True

这将使该字段可编辑,因此您可以实际更改它。它似乎工作正常,至少与mysql支持引擎。我不能说certian是否有其他后备存储会使这些数据在数据库中不可变,因此在尝试编辑时会导致问题,所以请谨慎使用

答案 3 :(得分:7)

根据您的具体需求以及行为差异的细微差别,您可以执行以下操作:

from django.utils.timezone import now

class MyModel(models.Model):
    date = models.DateTimeField(default=now)

默认字段可以这种方式使用:https://docs.djangoproject.com/en/dev/ref/models/fields/#default

The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.

这不会将可编辑设置为False

答案 4 :(得分:5)

可能与auto_now_add为true有关。也许代替用于捕获添加日期的参数,您可以覆盖模型保存方法,以在id为null时插入日期时间。

class Rating(models.Model):

    ....
    def save(self, *args, **kwargs)
        if not self.id: 
            self.date = datetime.datetime.now()

答案 5 :(得分:3)

如果您希望在所有条目的列表中显示任何字段(当您单击管理员中的模型时),而不是当您打开该特定条目时 -

class RatingAdmin(admin.ModelAdmin):
    list_display = ('name', 'date') 

admin.site.register(Rating, RatingAdmin)

'name'是您要在管理面板中显示的主要字段或任何其他字段。

这样您就可以指定要查看的所有列。

答案 6 :(得分:0)

您不能这样做,请查看documentation

auto_now auto_now_add 都是不可编辑的字段,您无法覆盖它们......

答案 7 :(得分:0)

可以简单地通过admin.py中的以下代码在Django admin中显示

@admin.register(model_name)
class model_nameAdmin(admin.ModelAdmin):
 list_display = ['date']

Above code will display all fields in django admin that are mentioned in     'list_display', no matter the model field is set to 'True' for 'auto_now' attribute

答案 8 :(得分:0)

我想创建一个默认为当前时间的可编辑时间字段。

我实际上发现最好的选择是完全避免使用 auto_nowauto_add_now,而只使用日期时间库。

MyTimeField = models.TimeField(default=datetime.now)

最重要的是你应该让它成为变量 now 而不是函数/getter,否则你每次调用 makemigrations 时都会得到一个新的默认值,这将导致在生成一堆冗余迁移。