具有 auto_now_add=True 的自定义用户模型会导致用户管理"non-editable field"异常



我正在学习python Django。我已经创建了一个自定义用户模型并且它正在工作,但是每当我通过 Django 管理员访问任何用户的个人资料时,我都会收到此错误:

Exception Value:    
'date_joined' cannot be specified for UserProfile model form as it is a non-editable field. Check fields/fieldsets/exclude attributes of class UserAdminModel.

这是我的自定义用户配置文件模型:

class UserProfile(AbstractBaseUser, PermissionsMixin):
    """ A model for authors and readers."""
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    username = models.CharField(max_length=255, unique=True)
    email = models.EmailField(max_length=255, unique=True)
    password = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)
    REQUIRED_FIELDS = ['email', 'password']
    USERNAME_FIELD = 'username'
    objects = UserProfileManager()
    def __str__(self):
        return self.username

我正在使用默认的 Django AdminModel:

class UserAdminModel(UserAdmin):
    pass

Django 管理站点希望 date_joined 字段是可编辑的 - 但您的自定义用户模型不允许这样做 - 因为auto_now_add总是设置当前日期。

此行为是已知的并记录在案:

如当前实现的那样,将auto_now或auto_now_add设置为 True 将导致字段设置可编辑=假和空白=真。

  1. 要么你明确地进行更改,告诉 Django 它确实不是可编辑的:
class UserAdminModel(UserAdmin):
    readonly_fields = ["date_joined"]
  1. 或者还原你的更改,回到 Django 默认设置的该字段可编辑:
class UserProfile(AbstractBaseUser, PermissionsMixin):
    # [..]
    date_joined = models.DateTimeField(default=timezone.now)

您可能想走第二条路线。我还没有检查您在自定义用户模型中覆盖的任何其他字段是否与 Django 默认管理员不兼容。如果进行了更改,请使其足够有意义,以保证更新相关窗体或管理视图的额外工作。

最新更新