django自定义用户-user模型

本文介绍了在Django中自定义用户模型User的过程和注意事项,包括为何要自定义、如何自定义、字段解释以及在views中的使用。官方推荐使用AbstractUser,但一旦涉及依赖,重新自定义成本高昂。自定义时需删除migration文件夹中的py文件,并添加所需字段,如手机号和验证码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:django官方建议使用导入AbstractUser自定义模型,即使是现有的user模型完全满足现有的需求,一旦建议了依赖关系(包括admin),重新使用自定义模型的代价非常昂贵!

更新user模块时 需要删除migration文件夹(所有应用的)中的py文件才能成功,不知道为什么...

字段:这里的字段实际上可以当属性使用,没搞懂和方法有什么不同,后续找到不同再补充。

默认user字段

字段 解释 username 必要的。150 个字符或以下。用户名可包含字母数字、_、@、+、. 和 - 字符。个人建议将这个值设定为自增ID,然后其它自定义,以适应现在授权登录和手机验证码登录。 first_name 可选的(blank=True)。150 个字符或更少。 last_name 可选的(blank=True)。150 个字符或更少。 email 可选的(blank=True)。电子邮件地址。 password 需要。一个密码的哈希值和元数据。越来越少被需要 groups 多对多关系到 Group,分组比如说普通和VIP user_permissions 多对多关系到 Permission,权限。 is_staff 布尔型。指定该用户是否可以访问管理站点。我的理解是是否可以访问后台。 is_active 布尔值。指定该用户账户是否应该被视为活跃账户。我们建议你把这个标志设置为 False。 is_superuser 布尔值。指定该用户拥有所有权限,而不用一个个开启权限。这个是设定超级用户用的吧 last_login 用户最后一次登录的日期时间。 date_joined 指定账户创建时间的日期时间。帐户创建时,默认设置为当前日期/时间。

user属性
属性解释
is_authenticated只读属性,始终返回 True (匿名用户 AnonymousUser.is_authenticated 始终返回 False )。这是一种判断用户是否已通过身份认证的方法。
is_anonymous只读属性,总是 False。这是区分 User 和 AnonymousUser 对象的一种方式。一般来说,你应该优先使用 is_authenticated 来代替这个属性

user方法
方法解释
get_username()返回用户的用户名。由于 User 模型可以被替换,你应该使用这个方法而不是直接引用用户名属性。其实也可以直接使用用户名属性,还没搞清楚区别。
get_full_name()返回 first_name 加上 last_name,中间有一个空格。
get_short_name()返回 first_name。
set_password(raw_password)将用户的密码设置为给定的原始字符串,并进行密码哈希处理。不保存 User 对象。我的理解是使用后必须修改。
check_password(raw_password)如果给定的原始字符串是用户的正确密码,返回 True。(密码哈希值用于比较),密码登录的校验
set_unusable_password()标记该用户没有设置密码。 check_password() 对这个用户的检查永远不会返回 True。不会保存 User 对象。比如说外部验证登录-微信授权登录。
has_usable_password()如果 set_unusable_password() 被调用,返回 False。
get_user_permissions(obj=None)

返回用户直接拥有的一组权限字符串。

如果传入了 obj,则只返回这个特定对象的用户权限。

get_group_permissions(obj=None)返回用户通过他们的组拥有的一组权限字符串。如果传入了 obj,则只返回这个特定对象的用户权限。
get_all_permissions(obj=None)返回用户拥有的一组权限字符串,包括通过组和用户的权限。如果传入了 obj,则只返回这个特定对象的用户权限。
has_perm(perm, obj=None)如果用户拥有指定的权限,返回 True。如果用户是不活跃的,这个方法将总是返回 False。对于活跃的超级用户,本方法将始终返回 True,有2层校验;如果传入了 obj,这个方法不会检查模型的权限,而是检查这个特定对象的权限。
has_perms(perm_list, obj=None)如果用户拥有指定的每个权限,返回 True,其中每个 perm 的格式为 "<app label>.<permission codename>"。如果用户不活跃,本方法将总是返回 False。对于活跃的超级用户,本方法将始终返回 True。
has_module_perms(package_name)如果用户在给定的包(Django 应用标签)中有任何权限,则返回 True。如果用户不活跃,本方法将总是返回 False。如果是活跃的超级用户,本方法将始终返回 True。
email_user(subject, message, from_email=None, **kwargs)向用户发送邮件。如果 from_email 是 None,Django 使用 DEFAULT_FROM_EMAIL。任何 **kwargs 都会传递给底层的 send_mail() 调用。
user管理器
字段解释
create_user(username, email=None, password=None, **extra_fields)

创建、保存并返回一个 User。

username 和 password 按给定设置。email 的域名部分会自动转换为小写,返回的 User 对象的 is_active 设置为 True。

如果没有提供密码, set_unusable_password() 将被调用。

extra_fields 关键字参数被传递到 User 的 __init__ 方法中,允许在 自定义用户模型 上设置任意字段。

create_superuser(username, email=None, password=None, **extra_fields)与 create_user() 相同,但将 is_staff 和 is_superuser 设置为 True。
with_perm(perm, is_active=True, include_superusers=True, backend=None, obj=None)

with_perm(perm, is_active=True, include_superusers=True, backend=None, obj=None)¶
返回拥有给定权限 perm 的用户,可以是 "<app label>.<permission codename>" 格式,也可以是 Permission 实例。如果没有找到拥有 perm 的用户,返回一个空的查询集。

如果 is_active 为 True (默认),则只返回活跃用户,如果 False,则只返回非活跃用户。使用 None 返回所有用户,无论其是否处于活跃状态。

如果 include_superusers 为 True (默认),结果将包括超级用户。

如果传入了 backend,并且在 AUTHENTICATION_BACKENDS 中定义了,那么本方法将使用它。否则,它将使用 AUTHENTICATION_BACKENDS 中的 backend,如果只有一个的话,或者引发一个异常。

自定义用户

models,可添加自己需要的字段,如手机号和验证码等,一定要先设置好settings后再执行migrate。

from django.db import models
#导入自定义类
from django.contrib.auth.models import AbstractUser
#导入uuid
import uuid


class MyUser(AbstractUser):
#新增UUID字段,注意建议一开始就创建,因为是唯一的和不能为空的,有数据后再新增需要特殊方式迁移
    uuid=models.UUIDField(default=uuid.uuid4,unique=True)
    def __str__(self):
        return str(self.mobilename)
    class Meta:
        #数据库表名
        #db_table = 'user'
        verbose_name = '用户'
        verbose_name_plural = '用户'

settings,修改默认的模型。

AUTH_USER_MODEL=‘myapp.MyUser’:

models当需要让用户拥有自己的数据时,不能使用默认的user

class Grade(models.Model):
    owner=models.ForeignKey(
                         #官方建议使用,还有另外的方法稍微复杂
                            settings.AUTH_USER_MODEL,
                            on_delete=models.CASCADE,
                            verbose_name='用户'
                            )

views中的使用

def grade(request,paper_id):
    #这里必须是个QuerySet,不能是实例
    user=request.user

    Grade.objects.update_or_create(      
                    owner=user,
                    t_id=topic_tid.id,
                    defaults={'score':score,'p_id':parameter.id}
                    )

因为是继承User,所有的默认字段都可以直接使用新增/修改/删除,如用户名/密码和邮件等,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值