Datetimefield datefield 无法设置为editable

当我尝试将带有DateTimeField, DateField字段加入到Django后台中的 list_editable中时提示出错,信息如下:

< class 'blog.admin.ArticleAdmin' >: (admin.E125) The value of 'list_editable[1]' refers to 'publish_date' ,
which is not editable through the admin.

经过一番努力,我找到了原因:

这两个字段我添加了auto_now_add = True

我们知道,在django中,有DateTimeField、DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着
datetime()、date()、time()三种对象。这三个field都有的参数auto_now和auto_now_add.下面分别说下:

DateTimeField:
auto_now:默认为False, 当它被设置为True时,在保存该字段时,它的值被设置成当前时间,每次修改model, 都会自动
更新.也就是说:它适用于要保留"最后修改时间"的场景.但同时,在django admin管理器中,它将是readonly状态, 也就
是无法修改的,像上面提示的错误那样.


auto_now_add:默认为False, 设置为True时,会在Model第一次创建时将字段时间保存为创建时间, 后面对model进
行修改,它的值仍然保持为创建时的时间,也就是说:它适用于要保留"创建时间"的场景.同样,如果它被设置为True, 在
admin中也是readonly状态.


那么,这有什么影响呢?
当auto_now, auto_now_add被设置为True时, 会导致字段变成editable=False,blank=True, 而editable=False又会导
致字段不会显示在admin中, 假若强制在admin中显示,就会报错,此时只有一个办法,将该字段加入到readonly_fields

这样看来,DateTimeField, DateFeild不是不能修改了吗?有时候就有要修改时间的需求啊?
我们知道model中字段都有一个default参数, 它用来给字段设置默认值,而当前时间又可以通过timezone.now来得到


from django.utils import timezone
publish_date = models.DateField(verbose_name='发表日期', default=timezone.now)
这样在admin的list_editable中加入该 字段, 后台就可以既保存当前时间, 又能修改.

上一篇:数据库备份与还原

下一篇:Django Ajax使用