Django管理后台无法看到auto_now_add

Django管理后台无法看到auto_now_add

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字段的问题。要根据具体情况选择哪种方法来解决这个问题,如果需要在后台编辑这个字段的数值,可以采用方法一;如果只需要查看这个字段的数值,可以采用方法二。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程