注意: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 指定账户创建时间的日期时间。帐户创建时,默认设置为当前日期/时间。
属性 | 解释 |
is_authenticated | 只读属性,始终返回 True (匿名用户 AnonymousUser.is_authenticated 始终返回 False )。这是一种判断用户是否已通过身份认证的方法。 |
is_anonymous | 只读属性,总是 False。这是区分 User 和 AnonymousUser 对象的一种方式。一般来说,你应该优先使用 is_authenticated 来代替这个属性 |
方法 | 解释 |
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() 调用。 |
字段 | 解释 |
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)¶ 如果 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,所有的默认字段都可以直接使用新增/修改/删除,如用户名/密码和邮件等,