DateTimeField在管理系统中不显示


87

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

在我的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)

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

有人有什么主意吗?

Answers:


55

我相信理性在于auto_now_add领域。

这个答案

设置了auto_now属性的任何字段也将继承editable = False,因此不会显示在管理面板中。

文档中也提到

按照当前的实现,将auto_now或auto_now_add设置为True将导致该字段设置为editable = False和blank = True。

这确实是有道理的,因为如果保存该对象时用当前日期时间覆盖该字段,则没有理由使该字段可编辑。


31
虽然可以肯定,您应该能够首次创建条目auto_now_add通过管理员进行编辑?
Christopher Orr

68
即使它是不可编辑的,您也应该能够在管理界面中简单地显示它。
布拉德

1
请参阅下面@hunger的答案,以了解如何在管理界面中将其显示为只读字段。
吉瓦尔

1
如果仅在对象创建时初始化字段(auto_now_add = True),则使字段可编辑确实有意义。
sergzach '16

206

如果你真的想看到的管理面板日期,您可以添加readonly_fieldsadmin.py

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

admin.site.register(Rating,RatingAdmin)

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

可以从Django docs获得更多信息。


33
这是真正的答案!!
GreenAsJade 2014年

4
如果您指定a fields,则还必须在其中放置字段,这样就需要同时使用它readonly_fieldsfields否则该字段将不会显示。
比约恩2014年

我只是想指出,如果您正在使用fieldsets,这也适用,今天就遇到了这个问题。
凯文·布朗

1
这将使该字段仅在我们单击并打开特定条目时显示。如果您希望该字段在列表视图中可见,那么stackoverflow.com/a/34966908/4440874
Jyotman Singh 2016年

1
请注意,我不确定为什么,但是对于auto_now_add=TrueDjango 1.9下的DateTimeFields来说,这似乎不起作用。一种(替代)解决方法是将它们添加到list_display元组中。编辑:如果您还将字段添加fields为@BjornTipling,则它将起作用。
泰勒·埃德米斯顿

23

主要技巧:

如果您确实需要执行此操作(就像我一样),则可以随时通过立即将字段设置为“可编辑”来定义该字段,从而对其进行破解:

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

这将使该字段可编辑,因此您实际上可以对其进行更改。似乎至少可以在mysql支持引擎上正常工作。我不能告诉certian其他后备存储是否会使该数据在数据库中不可变,从而在尝试编辑时引起问题,因此请谨慎使用


不,不要这样做,请使用Hunger描述的readonly_fields解决方案。
GreenAsJade

2
@GreenAsJade:一个基本原理会很好。
mhsmith 2015年

@mhsmith原理可以使用Hunger的解决方案来代替此方法:因为这是一个主要的技巧,并且带有“谨慎使用”,所以Hunger的解决方案使用django来设计其使用方式。当您以合法和受支持的方式完成您需要做的事情时,为什么还要冒险冒险?
GreenAsJade

6
这种黑客解决方案还不错。但是我看到的唯一用例是测试-测试人员需要更改日期时。
jacoor 2015年

2
只是警告:此黑客为我搞砸了迁移工作
damio

16

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

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


1
我会用from django.utils.timezone import now代替datetime.now,但这看起来很有希望。
amjoconn

谢谢,我改变了。
orblivion 2015年

Stackoverflow非常棒,因为一些答案使您意识到自己没有提出正确的问题!谢谢。
塞缪尔·道祖

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()

如果您这样做了,那么就没有理由将字段定义为auto_now了-FallenAngel 2011
6

不知道为什么要投票;Shawn Chin提供的第一个链接表明了类似的方法。
乔J

假设auto_now未使用和,这是一个明智的选择editable=False。+1
肖恩·

3

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

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

admin.site.register(Rating, RatingAdmin)

“名称”是您的主字段或要在管理面板中显示的其他任何字段。

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


0

您不能这样做,请查阅文档

auto_nowauto_now_add都是不可编辑的字段,您不能覆盖它们...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.