DateTimeField不会显示在管理系统中

dot*_*tty 74 python django admin django-admin

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

在我的admin.py文件中

from django.contrib import admin
from glasses.players.models import *
admin.site.register(Rating)
Run Code Online (Sandbox Code Playgroud)

而评级模型有一个名为"日期"的字段,如下所示

date = models.DateTimeField(editable=True, auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

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

有谁有想法吗?

Hun*_*ger 180

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

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

admin.site.register(Rating,RatingAdmin)
Run Code Online (Sandbox Code Playgroud)

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

其他信息可从Django文档获得.

  • 这才是真正的答案!! (25认同)
  • 如果你规定一个`fields`你也必须把你的字段放在那里,所以你需要在`readonly_fields`和`fields`中,否则字段就不会出现. (4认同)

Sha*_*hin 47

我相信理由是该auto_now_add领域的谎言.

这个答案:

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

文档中也提到:

如当前实现的那样,将auto_now或auto_now_add设置为True将导致该字段具有editable = False和blank = True set.

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

  • 您还应该能够在管理界面中简单*显示*它,即使它是不可编辑的. (61认同)
  • 虽然在首次创建条目之后你肯定能够通过admin*编辑`auto_now_add`吗? (30认同)

Bra*_*rad 22

哈克少校:

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

class Point(models.Model):
  mystamp=models.DateTimeField("When Created",auto_now_add=True)
  mystamp.editable=True
Run Code Online (Sandbox Code Playgroud)

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

  • 这个黑客解决方案并没有那么糟糕.然而,我看到的唯一用例是测试 - 当测试人员需要更改日期时. (6认同)
  • @GreenAsJade:理由很好. (2认同)
  • 只是一个警告:这个黑客搞砸了我的迁移 (2认同)

orb*_*ion 9

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

from django.utils.timezone import now

class MyModel(models.Model):
    date = models.DateTimeField(default=now)
Run Code Online (Sandbox Code Playgroud)

默认字段可以这种方式使用: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.
Run Code Online (Sandbox Code Playgroud)

这不会设置为可编辑 False


Jyo*_*ngh 6

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

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

admin.site.register(Rating, RatingAdmin)
Run Code Online (Sandbox Code Playgroud)

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

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


Joe*_*e J 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()
Run Code Online (Sandbox Code Playgroud)