管理系统中不显示 DateTimeField

为什么我的“约会”字段不出现在管理系统中?

在我的 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,字段也不显示。

有人知道吗?

39908 次浏览

我相信理性在于 auto_now_add领域。

来自 这个答案:

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

那些文件中也提到:

按照目前的实现,设置 Auto _ now 或 auto _ now _ add 到 True will 使字段具有可编辑性 = False 和空白 = 真集。

这是有意义的,因为如果在保存对象时要用当前日期时间覆盖字段,那么就没有理由让该字段可编辑。

它可能与 auto _ now _ add 为 true 有关。也许您可以重写 model save 方法,在 id 为 null 时插入 datetime,而不是使用该参数来捕获 add 时的日期。

class Rating(models.Model):


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

你不能这样做,检查 文件

Auto _ now Auto _ now _ add都是 不能编辑字段,您不能覆盖它们..。

哈克少校:

If you really need to do this (as I do) you can always hack around it by immediatley setting the field to be "editable" defining the field as follows:

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

这将使字段可编辑,因此实际上可以对其进行更改。它似乎工作得很好,至少在 mysql 支持引擎中是这样。我不能肯定地说,如果其他支持存储将使这个数据在数据库中不可变,从而在尝试编辑时引起问题,so use with caution

如果你真的想在管理面板中看到日期,你可以在 Admin.py中添加 readonly_fields:

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


admin.site.register(Rating,RatingAdmin)

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

其他信息可从 姜戈医生获得。

根据你的具体需求,以及行为上的细微差别,你可以做以下事情:

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

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

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


admin.site.register(Rating, RatingAdmin)

“ name”是您的主字段或者您想在管理面板中显示的任何其他字段。

通过这种方式,您可以指定要查看的所有列。

可以在 Django admin 中通过以下 admin.py 代码显示

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

以上代码将显示在 django 管理中的所有字段,这些字段在 list_display中提到,无论模型字段为 auto_now属性设置为 True

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

实际上,我发现最好的选择是完全避免使用 auto_nowauto_add_now,只使用 datetime 库。

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

The big thing is that you should make it's the variable now instead of a function/getter, otherwise you're going to get a new default value each time you call makemigrations, which will result in generating a bunch of redundant migrations.

这是 饥饿的答案和 Rahul Kumar建议的装饰器的组合:

在 admin.py 中,您只需要:

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

The fields specified in readonly_fields will appear in the add and change page i.e. inside the individual record. And - of course - are not editable.

list_display中的字段将构成管理员主列表页面中的表示(即所有记录的列表)。在这种情况下,不仅指定 list_display = ('date',)是有意义的,因为您将只看到日期。相反,还要包含记录的主标题/名称。

Example:

readonly_fields = ('title', 'date',)

如果在 models.py 中,这个模型被定义为:

class Rating(models.Model):
title = models.CharField('Movie Title', max_length=150)
...
date = models.DateTimeField(editable=True, auto_now_add=True)


def __str__(self):
return self.title