Django 1.8扩展/自定义User

本文介绍了在Django中自定义User模型的三种方法:通过OneToOneField关联默认User、扩展默认User表以及完全重写User表。文章详细阐述了每种方法的实现步骤,并提供了代码示例。

方式一:OneToOneField方式

参见官方文档或者翻译版

该方式没有什么特别之处,就是一对一的两个表,创建User不一定创建扩展,他们只是外键关系,不再赘述

方式二:扩展User表

参见官方文档或者翻译版

需求

如果你很满意默认User,只是想添加几个字段,那么使用这种方式即可。

目录结构

创建存放自定义User的包,目录结构如下

├── curr                                自定义User所在包
│   ├── __init__.py
│   ├── models.py                  
├── manage.py
└── tuser
    ├── __init__.py
    ├── settings.py                    配置文件
    ├── urls.py
    └── wsgi.py
settings配置
INSTALLED_APPS = (
    'curr'        # 添加一行,添加该app
)
AUTH_USER_MODEL = 'curr.MyUser'     # 本系统用户表(必须在app下的models.py文件,否则找不到Model)
自定义用户Model

在User所在包的models.py中添加

#coding:utf-8
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, AbstractUser

class User(AbstractUser):
        # 继承AbstractUser,该Model和默认User的字段方法一样,只需要添加自己需要的字段即可
        test = models.CharField(max_length=40)        # 自定义的字段

创建完后在数据表auth_user中添加该字段

使用自定义User

参见官方文档翻译版

使用时不能再from django.contrib.auth.models import User

  1. 创建其他Model的外键时可以如下
from django.conf import settings
class UserType(models.Model):
       user = models.ForeignKey(settings.AUTH_USER_MODEL)
       type = models.CharField(max_length=10)

或者

from curr.models import MyUser
class UserType(models.Model):
       user = models.ForeignKey(MyUser)
       type = models.CharField(max_length=10)

视图函数中使用时可以

from curr.models import MyUser
# 或者
from django.contrib.auth import get_user_model
get_user_model()    # 该方法只在所有Model都已经加载完后使用

方式三:重写User表

参见官方文档或者翻译版

需求

如果对默认User不满意,需要完全自定义(例如以phone为唯一标示,不以默认的username)

目录结构

同方式二

settings配置

同方式二

自定义用户Model

在User所在包的models.py中添加

# coding=utf8

import datetime
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
from django.db.models import F

from django.contrib.auth.models import User
from django.conf import settings
class MyUserManager(BaseUserManager):
    """
    功能说明:自定义用户Model管理器
    """
    use_in_migrations = True

    def _create_user(self, username, password, **extra_fields):
        """
        Creates and saves a User with the given username, email and password.
        """
        now = datetime.datetime.now()
        if not username:
            raise ValueError('The given username must be set')
        user = self.model(username=username, add_time=now, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user
    
    # 实现一下两个方法用于创建账号
    def create_user(self, username, password=None, **extra_fields):
        return self._create_user(username, password, **extra_fields)

    def create_superuser(self, username, password, **extra_fields):
        return self._create_user(username, password, **extra_fields)


class User(AbstractBaseUser):
    """
    功能说明:自定义用户
    """
    username = models.CharField(u"帐号/用户名", max_length=30, unique=True)
    name = models.CharField(u"姓名", max_length=30)
    phone = models.CharField(u'手机', max_length=11)
    add_time = models.DateTimeField(u'创建时间')

    objects = MyUserManager()                        # 设置自定义的相应管理器

    USERNAME_FIELD = 'username'                 # 必须(用户唯一标示字段)
    REQUIRED_FIELDS = ['add_time', 'name']    # 必须(不能缺省字段)

    class Meta:
        db_table = "auth_user"                        # 定义数据表名

创建完后在数据表auth_user中添加该字段

使用自定义User

同方式二

转载于:https://my.oschina.net/watcher/blog/848565

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值