自定义 User(一)

当我们要自定义的 User model 的时候,应该考虑以下几点:

  • 1. 模型必须有一个唯一的字段可被用于识别目的。可以是一个用户名,电子邮件地址,或任何其它独特属性。

  • 2. 你的模型必须提供一种方法可以在 "short" and "long" form 可以定位到用户。最普遍的方法是用用户的名来作为简称,用用户的全名来作为全称。然而,对这两种方式没有特定的要求,如果你想,他们可以返回完全相同的值。




创建一个规范的自定义模型最简单的方法是继承 AbstractBaseUser,并且创建一个继承自 BaseUserManager 的新的 UserManager 来管理我们自定义的 User 模型。

以下是一个完整例子。

新建一个 myUserApp 来作为自定义 User 的 App。

编写 models.py,MyUser 就是我们自定义的 User 模型,MyUserManager 是它的管理器:

from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)

class MyUserManager(BaseUserManager):
    # 用 email,date_of_birth 和密码创建一个新用户
    def create_user(self, email, date_of_birth, password=None):
        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,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    # 用 email,date_of_birth 和密码创建一个新的超级用户
    def create_superuser(self, email, date_of_birth, password):
        user = self.create_user(email,
            password=password,
            date_of_birth=date_of_birth
        )
        user.is_admin = True
        user.save(using=self._db)
        return user


class MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    date_of_birth = models.DateField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    # 指定 MyUser 模型的管理器
    objects = MyUserManager()

    # 描述User模型上用作唯一标识符的字段名称
    # 字段必须必须是唯一的(即在其定义中设置unique=True)
    USERNAME_FIELD = 'email'

    # 当通过createsuperuser管理命令创建一个用户时
    # 系统会提示用户输入以下字段
    REQUIRED_FIELDS = ['date_of_birth']

    # 返回 email 地址
    def get_full_name(self):
        return self.email

    # 返回 email 地址
    def get_short_name(self):
        return self.email

    def __str__(self):              # __unicode__ on Python 2
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

在 setting.py 中加上以下内容:

AUTH_USER_MODEL = 'myUserApp.MyUser'

现在我们自定义的 User 模型创建好了。它要求使用 email 而非用户名来作为登陆的依据。




在 shell 中检验我们自定义的 User 模型。

创建用户:

from myUserApp.models import MyUser

u = MyUser.objects.create_user(email='diego@django.com', date_of_birth='1999-1-1', password='diego12345')

u
>>>  <MyUser: diego@django.com>

验证用户:

from django.contrib.auth import authenticate

u = authenticate(email='diego@django.com', password='diego12345')

u
>>> <MyUser: diego@django.com>

** 获取用户:**
BaseUserManager 提供一个 get_by_natural_key(username) 方法,通过 USERNAME_FIELD (本例中是:"email") 指定的字段来获取用户实例。

u = MyUser.objects.get_by_natural_key('diego@django.com')
u
>>> <MyUser: diego@django.com>

也可以用 get 方法:

u = MyUser.objects.get(email='diego@django.com')
u
>>> <MyUser: diego@django.com>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,170评论 22 257
  • cms_project 项目,自定义用户和相关权限设置 1.重写用户模型 1.1 修改配置文件,覆盖默认的User...
    常大鹏阅读 25,821评论 1 26
  • 4 创建一个社交网站 在上一章中,你学习了如何创建站点地图和订阅,并且为博客应用构建了一个搜索引擎。在这一章中,你...
    lakerszhy阅读 2,168评论 0 7
  • 高中三年,我们都互不相识,只是从同一个语文老师哪里听到过关于对方的故事。 高考,你考上了二本,但你不甘心,...
    Tmomy阅读 195评论 0 1