【问题标题】:Make `createsuperuser` work with custom / non-trivial user model使`createsuperuser` 使用自定义/非平凡用户模型
【发布时间】:2014-10-11 08:05:44
【问题描述】:

python manage.py syncdb的“创建超级用户”步骤中,我希望能够指定

  1. 电子邮件
  2. 密码
  3. 名字
  4. 中间名(可以留空)
  5. 姓氏
  6. 电话

我的“用户模型”是:

class Account(auth_models.AbstractBaseUser):
    email       = models.EmailField(unique = True, db_index = True)
    created_on  = models.DateField(auto_now_add = True)
    person      = models.ForeignKey(Person)
    def get_full_name(self):
        ...
    def get_short_name(self):
        ...
    objects = AccountManager()
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

Person 模型是:

class Person(models.Model):
    name         = models.CharField(max_length = 256)
    is_staff     = models.BooleanField(default = False)
    phone        = models.CharField(max_length = 16, blank = True)

我的自定义帐户“经理”自然需要拥有所有这些信息,所以我所做的是:

def create_user(self, email, password, name, phone):
    normalized_email = self.normalize_email(email)
    person = Person(
        name = name,
        phone = phone
    )
    person.save()
    account = Account(email = normalized_email, person = person)
    account.set_password(password)
    account.save()
    return account

当然,在创建时它只询问我电子邮件和密码,而完全忽略了同样需要填充的 Person 模型。

如何才能使“创建超级用户”步骤中的所有 6 个字段都是必需的?

对于那些质疑将AccountPerson 分开的想法的人:一个Person 可以有多个与之关联的Account;这称为PersonAccount 之间的“一对多关系”;完全合法,请咨询您的律师。


我尝试将person 添加到REQUIRED_FIELDS 中,但正如documentation 中所指定的那样:

由于在 createsuperuser 提示期间无法传递模型实例,因此希望用户输入现有实例的 to_field 值(默认为 primary_key)的值。

需要一个我没有的Person ID(我需要先创建这个人)。

指定:

REQUIRED_FIELDS = ['person.name', ...]

不支持(错误提示person.name is not a field of Account)。

【问题讨论】:

  • 简单的解决方案可以将 Person 设置为 null=True 或提供默认值...

标签: python django django-models foreign-keys


【解决方案1】:

您需要一个名为create_superuser() 的方法,该方法应如下所示:

def create_superuser(self, email, password, name, phone): user = self.create_user( email=email, password=password, name = name, phone = phone ) user.save(using=self._db) return user

这种方式REQUIRED_FIELDS = ['person'] 对我有用。

【讨论】:

    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2014-01-04
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多