Django 覆盖默认管理员注册表单

Django override default admin register form

我知道如何覆盖 UserCreationForm 但它只适用于用户,不适用于管理员注册。

这是我的案例...

我修改了默认用户模型,它现在有不能为空的字段user_company

class User(AbstractUser):
    user_company = models.ForeignKey("UserCompany", on_delete=models.CASCADE)

我已经覆盖了 UserCreationForm:

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm

class UserRegisterForm(UserCreationForm):

    class Meta(UserCreationForm.Meta):
        model = get_user_model()


    def save(self, commit=True):
        user_company = UserCompany() ## create a new company and assign it to the new user
        user_company.save()

        user = super(UserRegisterForm, self).save(commit=False)        
        user.user_company_id = user_company.pk

        if commit:
            user.save()
        return user

所有这一切对普通用户来说都很好用。但是,当我尝试在控制台中 python manage.py createsuperuser 时,输入管理员用户名和密码后,出现

错误

the field user_company cannot be Null

您不是在数据库中创建一个新的 UserCompany,只是一个内存对象,替换

user_company = UserCompany() ## create a new company and assign it to the new user

类似

user_company = UserCompany.objects.create()

我认为最好在用户的保存功能中移动默认 UserCompany 的创建,而不是将其放在表单中

class User(AbstractUser):
   user_company = models.ForeignKey("UserCompany", on_delete=models.CASCADE)

   def save(self, *args, **kwargs):
       if getattr(self, "user_company", None) is None:
            self.user_company = UserCompany.objects.create()

       super(User, self).save(*args, **kwargs)