为什么我的“日期”字段没有出现在管理系统中?
在我的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
,该字段也不会显示。
有没有人有任何想法?
答案 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_now
或 auto_add_now
,而只使用日期时间库。
MyTimeField = models.TimeField(default=datetime.now)
最重要的是你应该让它成为变量 now
而不是函数/getter,否则你每次调用 makemigrations
时都会得到一个新的默认值,这将导致在生成一堆冗余迁移。