Django管理后台无法看到auto_now_add
在Django中,我们可以通过在模型类中使用auto_now_add=True
来设置一个字段在创建对象时自动保存当前时间的功能。但是有时候,在Django的管理后台中,我们发现这个字段并没有显示出来,导致我们无法在后台编辑这个字段的数值。
问题分析
这个问题的根源在于Django的管理后台默认情况下不会显示自动填充的字段。auto_now_add=True
就是一个自动填充的字段,在对象创建时会自动填入当前的时间。
解决方法
方法一:重写模型的save()方法
我们可以通过在模型类中重写save()
方法来手动保存auto_now_add=True
字段的数值。例如:
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=50)
created_at = models.DateTimeField(auto_now_add=True)
def save(self, *args, **kwargs):
if not self.pk:
self.created_at = timezone.now()
super().save(*args, **kwargs)
在上面的代码中,我们重写了MyModel
模型的save()
方法,在对象保存时判断是否已经有主键值(即是否是新创建的对象),如果是新创建的对象,则手动填充created_at
字段。
方法二:使用readonly_fields属性
我们还可以通过在管理类中设置readonly_fields
属性来实现在Django管理后台中显示auto_now_add=True
字段。例如:
from django.contrib import admin
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
readonly_fields = ('created_at',)
在上面的代码中,我们通过设置readonly_fields
属性将created_at
字段设置为只读的,这样在Django管理后台中就可以看到这个字段了,虽然不能编辑它,但至少能看到它的数值。
实际应用
下面通过一个简单的示例来演示上述两种方法的使用和效果。
首先,在models.py
中定义一个模型类MyModel
:
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=50)
created_at = models.DateTimeField(auto_now_add=True)
然后,在admin.py
中注册这个模型类并设置管理类:
from django.contrib import admin
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
readonly_fields = ('created_at',)
最后,在Django管理后台中就可以看到created_at
字段了,尽管它是只读的,但至少我们可以在后台查看这个字段的数值了。
总结
通过上述两种方法,我们可以解决Django管理后台无法看到auto_now_add=True
字段的问题。要根据具体情况选择哪种方法来解决这个问题,如果需要在后台编辑这个字段的数值,可以采用方法一;如果只需要查看这个字段的数值,可以采用方法二。