Django覆盖默认的管理员注册表格

时间:2020-03-30 16:34:52

标签: python django django-admin modelform

我知道如何覆盖UserCreationForm,但它仅对用户有效,对管理员注册无效。

这是我的情况...

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

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时,输入管理员的用户名和密码后,我得到了一个错误

字段user_company不能为空

1 个答案:

答案 0 :(得分:1)

您不是在数据库中创建新的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)