Django自定义用户模型创建超级用户时如何取消组织字段必填要求
解决Django自定义用户模型创建超级用户时必填Organisation的问题
你的自定义用户模型中,organisation字段已设置null=True,但由于REQUIRED_FIELDS包含该字段,且create_superuser方法强制要求传入该参数,导致创建超级用户时必须填写。可以通过以下两步解决:
1. 修改用户模型的REQUIRED_FIELDS
将organisation从REQUIRED_FIELDS中移除,因为该字段允许为空,普通用户的必填验证可以在视图层处理,无需依赖模型的REQUIRED_FIELDS:
class MyUser(AbstractBaseUser): username = models.CharField(max_length=256,unique=True) email = models.EmailField(max_length=256) organisation = models.ForeignKey(Organisation,on_delete=models.CASCADE,null=True) USERNAME_FIELD = "username" # 移除organisation,只保留email作为必填项 REQUIRED_FIELDS = ['email'] objects = MyUserManager() def __str__(self): return self.username
2. 重写create_superuser方法,允许organisation参数可选
修改MyUserManager中的create_superuser方法,让organisation参数默认值为None,同时调整create_user方法适配可选参数:
class MyUserManager(BaseUserManager): def create_user(self, username, email, password, organisation=None): # 若普通用户必须关联组织,可在此添加验证逻辑 # if not organisation: # raise ValueError("普通用户必须绑定所属组织") email = self.normalize_email(email) user = self.model(username=username, email=email, organisation=organisation) user.set_password(password) user.save(using=self.db) return user def create_superuser(self, username, email, password, organisation=None): user = self.create_user(username=username, email=email, password=password, organisation=organisation) user.is_superuser = True user.is_staff = True user.save() return user
补充:普通用户的必填验证
如果业务要求普通用户必须关联组织,不要在模型层限制,而是在创建视图中添加验证逻辑,同时手动处理密码加密(CreateView不会自动处理密码哈希):
from django.core.exceptions import ValidationError class Create_Accounts(CreateView): model = models.MyUser fields=('username', 'email', 'password', 'organisation') template_name = 'accounts/create_account.html' success_url = reverse_lazy("accounts:inner_index") def form_valid(self, form): if not form.cleaned_data.get('organisation'): raise ValidationError("普通用户必须选择所属组织") # 手动加密密码 user = form.save(commit=False) user.set_password(form.cleaned_data['password']) user.save() return super().form_valid(form)
修改完成后,执行createsuperuser命令时,系统仅会要求输入username、email和password,无需填写organisation,超级用户的该字段会自动设为None;普通用户通过表单创建时则会被强制要求选择组织,满足业务需求。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

