Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django自定义用户模型。。。。user.model(…)来自哪里?_Python_Django - Fatal编程技术网

Python Django自定义用户模型。。。。user.model(…)来自哪里?

Python Django自定义用户模型。。。。user.model(…)来自哪里?,python,django,Python,Django,因此,为了创建一个在线分类广告应用程序,我正在通过django文档的丛林进行工作。 因为用户应该能够在网上发布他们自己的分类广告,所以我需要使用用户身份验证系统。然而,他们需要能够通过电子邮件而不是用户名登录,这就是为什么我需要提出一个定制的用户模型 现在,django文档中包含的示例演练似乎很有帮助: 为了更好地理解django,我试图逐行地浏览示例,但有一点我不太明白: class MyUserManager(BaseUserManager): def create_user(self,

因此,为了创建一个在线分类广告应用程序,我正在通过django文档的丛林进行工作。 因为用户应该能够在网上发布他们自己的分类广告,所以我需要使用用户身份验证系统。然而,他们需要能够通过电子邮件而不是用户名登录,这就是为什么我需要提出一个定制的用户模型

现在,django文档中包含的示例演练似乎很有帮助:

为了更好地理解django,我试图逐行地浏览示例,但有一点我不太明白:

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()