Django User对象详解:字段、方法及用户管理实战

Mason
Mason
发布时间:2026-10-13 | 2人浏览过
原创

本文深入解析Django认证框架中的User对象,详细阐述其默认字段(如username、password)及核心方法(is_authenticated、set_password等)。通过具体代码示例,演示如何安全地创建用户、修改密码、验证身份以及处理超级用户权限,帮助开发者掌握Django用户管理的最佳实践。

Django User对象概述

User对象

User对象构成了Django认证系统的核心基础。它主要用于代表网站的用户,并支持访问控制、注册用户管理、关联内容创建者等功能。在Django的认证框架中,仅存在一个统一的用户类;所谓的超级用户('superusers')或工作人员用户('staff')仅仅是同一User对象设置了不同属性值的实例,而非独立的类。

User对象默认字段详解

缺省字段Fields

username

用户名是必需字段,长度限制在30个字符或更少,允许包含下划线(_)、@、加号(+)、点(.)和连字符(-)等字符。

first_name

可选字段,长度限制在30个字符或更少。

last_name

可选字段,长度限制在30个字符或更少。

email

可选字段,用于存储电子邮件地址。

password

密码是必需字段。值得注意的是,Django不会以明文形式存储密码,而是存储经过哈希处理后的值,以确保安全性。

groups

用户组,与Group模型建立多对多关系(Many-to-many relationship)。

user_permissions

用户特定权限,与Permission模型建立多对多关系(Many-to-many relationship)。


groups = models.ManyToManyField(Group, verbose_name=_('groups'),
  blank=True, help_text=_('The groups this user belongs to. A user will '
              'get all permissions granted to each of '
              'their groups.'),
  related_name="user_set", related_query_name="user")
user_permissions = models.ManyToManyField(Permission,
  verbose_name=_('user permissions'), blank=True,
  help_text=_('Specific permissions for this user.'),
  related_name="user_set", related_query_name="user")

is_staff

布尔值字段,决定用户是否有权访问Django admin管理界面,默认值为False。

is_active

布尔值字段,表示用户是否处于活跃状态,默认值为True。通常建议不直接删除用户记录,而是将用户的is_active属性设置为False来禁用账户。

is_superuser

布尔值字段,默认值为False。当设置为True时,该用户将获得所有权限。


def has_perm(self, perm, obj=None):
  """
  Returns True if the user has the specified permission. This method
  queries all available auth backends, but returns immediately if any
  backend returns True. Thus, a user who has permission from a single
  auth backend is assumed to have permission in general. If an object is
  provided, permissions for this specific object are checked.
  """
 
  # Active superusers have all permissions.
  if self.is_active and self.is_superuser:
    return True
 
  # Otherwise we need to check the backends.
  return _user_has_perm(self, perm, obj)

last_login

记录上一次登录时间,类型为datetime对象,默认值为当前时间。


user.last_login = timezone.now()

date_joined

记录用户创建的时间。

User对象核心方法解析

方法Methods

is_anonymous()

判断当前用户是否为匿名用户。

is_authenticated()

判断用户是否已通过验证并登录。

get_full_name()

返回first_name和last_name的组合,中间用空格分隔。

get_short_name()

仅返回first_name。

set_password(raw_password)

设置用户密码。该方法会自动对密码进行哈希处理。

check_password(raw_password)

验证提供的明文密码是否与存储的哈希值匹配。

get_group_permissions(obj=None)

返回用户所属组的权限集合。

get_all_permissions(obj=None)

返回用户的所有权限集合(包括通过组获得的权限)。

has_perm(perm, obj=None)

检查用户是否拥有指定的单个权限。perm参数的格式应为"<app label>.<permission codename>"。

has_perms(perm_list, obj=None)

检查用户是否拥有权限列表中列出的所有权限。

用户创建与管理实战

创建用户

由于User对象的密码是以哈希值形式存储的,因此创建User对象时不能直接使用Model的create方法,而必须使用内置的create_user()方法,该方法会自动处理密码哈希。


>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
 
# At this point, user is a User object that has already been saved
# to the database. You can continue to change its attributes
# if you want to change other fields.
>>> user.last_name = 'Lennon'
>>> user.save()

此外,也可以通过Django admin管理界面直接添加用户。

创建superusers


$ python manage.py createsuperuser --username=joe --email=joe@example.com

修改密码

使用内置的set_password()方法来安全地修改用户密码。


>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()

用户身份验证流程

验证用户

authenticate()

该函数用于验证提供的username和password是否对应一个有效用户。如果验证通过,则返回User对象;如果无效,则返回None。


from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
  # the password verified for the user
  if user.is_active:
    print("User is valid, active and authenticated")
  else:
    print("The password is valid, but the account has been disabled!")
else:
  # the authentication system was unable to verify the username and password
  print("The username and password were incorrect.")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表