带有 auto_now_add=True 的自定义用户模型会导致 UserAdmin 中的“不可编辑字段”异常

Mwi*_*ert 1 django django-models python-3.x

我正在学习 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.
Run Code Online (Sandbox Code Playgroud)

这是我的自定义 UserProfile 模型:

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

Run Code Online (Sandbox Code Playgroud)

我正在使用默认的 Django AdminModel:

class UserAdminModel(UserAdmin):
    pass
Run Code Online (Sandbox Code Playgroud)

小智 5

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

这种行为是已知的并记录在案

按照目前的实施,将 auto_now 或 auto_now_add 设置为 True 将导致该字段设置为 editable=False 和 blank=True 。

  1. 要么通过告诉 Django 它确实不可编辑来明确更改:
class UserAdminModel(UserAdmin):
    readonly_fields = ["date_joined"]
Run Code Online (Sandbox Code Playgroud)
  1. 或者恢复您的更改,返回到 Django 默认设置该字段可编辑:
class UserProfile(AbstractBaseUser, PermissionsMixin):
    # [..]
    date_joined = models.DateTimeField(default=timezone.now)
Run Code Online (Sandbox Code Playgroud)

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