Python Django自定义用户模型。。。。user.model(…)来自哪里?
因此,为了创建一个在线分类广告应用程序,我正在通过django文档的丛林进行工作。 因为用户应该能够在网上发布他们自己的分类广告,所以我需要使用用户身份验证系统。然而,他们需要能够通过电子邮件而不是用户名登录,这就是为什么我需要提出一个定制的用户模型 现在,django文档中包含的示例演练似乎很有帮助: 为了更好地理解django,我试图逐行地浏览示例,但有一点我不太明白:Python Django自定义用户模型。。。。user.model(…)来自哪里?,python,django,Python,Django,因此,为了创建一个在线分类广告应用程序,我正在通过django文档的丛林进行工作。 因为用户应该能够在网上发布他们自己的分类广告,所以我需要使用用户身份验证系统。然而,他们需要能够通过电子邮件而不是用户名登录,这就是为什么我需要提出一个定制的用户模型 现在,django文档中包含的示例演练似乎很有帮助: 为了更好地理解django,我试图逐行地浏览示例,但有一点我不太明白: class MyUserManager(BaseUserManager): def create_user(self,
class MyUserManager(BaseUserManager):
def create_user(self, email, date_of_birth, password=None):
"""
Creates and saves a User with the given email, date of
birth and password.
"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=self.normalize_email(email),
date_of_birth=date_of_birth,
)
我不明白“self.model(…)”是从哪里来的。这是一种方法吗?我在BaseUserManager中找不到它。。。它的定义是什么?我甚至不知道如何准确地表达这个问题,因为我对它感到困惑。。。有谁能告诉我我们在这里定义什么,目的是什么?它最初来自哪个django模型
提前感谢您的支持 Django模型将
ModelBase
作为元类。事实上,我们在报告中看到:
因此,它将使用对象的名称和方法类上的对象(字段)调用add_to_类
这种方法是:
因此,它会将管理器的model
属性设置为您将管理器添加到的类。如果您这样将其添加到User
模型中,那么self.model
将引用User
类。如果您随后致电self.model(email=)foo@bar.com,date_of_birth='1-1-2019')
,则它将使用构造一个用户
模型对象foo@bar.com“
作为电子邮件
,以及1-1-2019
作为出生日期
这是BaseManager声明的一部分:
#django.db.models.manager.BaseManager
def __init__(self):
super().__init__()
self._set_creation_counter()
self.model = None
self.name = None
self._db = None
self._hints = {}
你可以用用户名替换任何字段。例如手机号码
用户管理器:
class MyUserManager(BaseUserManager):
use_in_migrations = True
def _create_user(self, mobile_number, password, **extra_fields):
if not mobile_number:
raise ValueError('The given username must be set')
# email = self.normalize_email(email)
mobile_number = self.normalize_mobile_number(mobile_number)
user = self.model(mobile_number=mobile_number, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, mobile_number, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(mobile_number, password, **extra_fields)
def create_superuser(self, mobile_number, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(mobile_number, password, **extra_fields)
def normalize_mobile_number(self, mobile_number):
return mobile_number
用户模型:
class User(AbstractUser):
mobile_number = models.CharField(max_length=50,
unique=True,
verbose_name=_('Mobile Number'),
error_messages={
'unique': _("A user with that mobile number already exists."),
},
)
USERNAME_FIELD = 'mobile_number'
REQUIRED_FIELDS = []
objects = MyUserManager()
将管理器
对象添加到类时,它将在管理器对象中添加对模型对象的引用。这是通过元类逻辑完成的。@WillemVanOnsem我建议将此作为答案发布。解释发生在那个里的一点魔法。哇,在解释上付出了巨大的努力。。。因此=D、 我要谢谢你!不过,我需要经历两三次才能完全理解它。但它确实有帮助!
def contribute_to_class(self, model, name):
self.name = self.name or name
self.model = model
setattr(model, name, ManagerDescriptor(self))
model._meta.add_manager(self)
#django.db.models.manager.BaseManager
def __init__(self):
super().__init__()
self._set_creation_counter()
self.model = None
self.name = None
self._db = None
self._hints = {}
class MyUserManager(BaseUserManager):
use_in_migrations = True
def _create_user(self, mobile_number, password, **extra_fields):
if not mobile_number:
raise ValueError('The given username must be set')
# email = self.normalize_email(email)
mobile_number = self.normalize_mobile_number(mobile_number)
user = self.model(mobile_number=mobile_number, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, mobile_number, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(mobile_number, password, **extra_fields)
def create_superuser(self, mobile_number, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(mobile_number, password, **extra_fields)
def normalize_mobile_number(self, mobile_number):
return mobile_number
class User(AbstractUser):
mobile_number = models.CharField(max_length=50,
unique=True,
verbose_name=_('Mobile Number'),
error_messages={
'unique': _("A user with that mobile number already exists."),
},
)
USERNAME_FIELD = 'mobile_number'
REQUIRED_FIELDS = []
objects = MyUserManager()