在django admin中显示带有editable = False的DateTimeField

时间:2012-08-03 22:48:11

标签: django django-admin

我的日期字段为editable=False

该字段在创建时填充datetime.now()

由于管理员不会显示editable=False字段,因此我创建了自定义管理员。

自定义管理员使用包含此字段的表单:

date = forms.DateTimeField(widget=widgets.AdminSplitDateTime, required=False)

我想要实现的目标是:

  1. 用户将无法触及此字段(因此,editable=False
  2. 管理员可以更改字段的值但不会被强制(这就是为什么我有required=False
  3. 管理员将能够看到该字段的当前值。
  4. 我未能实现(3)。我创建了一个条目,当我查看数据库时,我发现它有一个有效的日期。但是当我从管理面板打开它时,日期小部件是空的。

    如何使日期小部件显示该字段的当前值?

1 个答案:

答案 0 :(得分:2)

首先,models.DateTimeField默认情况下在管理员中使用widgets.AdminSplitDateTime,您无需明确指定。

对于普通员工,请使用readonly_fields来阻止更改日期字段。

对于管理员,渲染其他更改表单以允许修改日期字段。在Django 1.4中,可以通过覆盖ModelAdmin.get_readonly_fields()

轻松完成
class YourModelAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        # we don't use self.readonly_fields anymore
        if request.user.is_superuser:
            return ()
        return ['date']