下面是 "Django 重写用户模型的实现" 的完整攻略:
1. 为什么要重写用户模型
Django自带的用户模型(User)虽然简单易用,但有时会出现一些局限性,比如你想在用户模型里添加一些自定义字段,这是非常麻烦的。为了解决这种情况,我们可以对Django的用户模型进行重写。
2. 重写用户模型的方法
重写用户模型的方法有两种:继承AbstractBaseUser和继承AbstractUser,下面分别介绍这两种方法。
2.1 继承AbstractBaseUser
继承AbstractBaseUser需要定义以下属性:
- username:用户名;
- email:电子邮箱地址;
- password:密码;
- is_active:用户是否处于激活状态;
- is_admin:用户是否为管理员。
下面是示例代码:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
class UserManager(BaseUserManager):
def create_user(self, email, username, password=None):
user = self.model(
email=self.normalize_email(email),
username=username,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email=self.normalize_email(email),
password=password,
username=username,
)
user.is_admin = True
user.is_active = True
user.save(using=self._db)
return user
class User(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=30, unique=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
def __str__(self):
return self.email
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return self.is_admin
这个示例代码中定义了一个UserManager来管理User实例。通过create_user方法创建User实例,并添加到数据库中。create_superuser方法会自动创建一个管理员用户。同时,我们也需要实现has_perm和has_module_perms方法来判断用户是否有权限。
2.2 继承AbstractUser
继承AbstractUser不需要定义任何属性,可以直接添加自定义字段。
下面是示例代码:
from django.contrib.auth.models import AbstractUser, UserManager
class User(AbstractUser):
avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
website = models.URLField(null=True, blank=True)
bio = models.TextField(max_length=500, null=True, blank=True)
objects = UserManager()
这里我们直接继承了AbstractUser,并添加了三个自定义字段。这里UserManager直接使用Django自带的UserManager。
3. 配置settings.py
在我们完成了User的重写后,我们需要在settings.py中配置AUTH_USER_MODEL属性。
AUTH_USER_MODEL = 'app_name.User'
这里的app_name就是你创建User模型的应用名。
4. 示例
下面是两个示例说明,分别演示了继承AbstractBaseUser和继承AbstractUser两种实现方式。
4.1 示例1:继承AbstractBaseUser
在这个示例中,我们创建了一个简单的博客网站。用户模型继承于AbstractBaseUser。
- 创建django项目,定义应用,并在应用下创建自定义用户模型(models.py):
```python
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
class MyUserManager(BaseUserManager):
def create_user(self, email, username, password=None):
if not email:
raise ValueError('必须填写电子邮件地址')
if not username:
raise ValueError('必须填写用户名')
user = self.model(
email=self.normalize_email(email),
username=username
)
user.set_password(password)
user.is_active = True
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email=email,
username=username,
password=password
)
user.is_active = True
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class MyUser(AbstractBaseUser):
email = models.EmailField(verbose_name='email', max_length=50, unique=True)
username = models.CharField(max_length=20, unique=True, null=False, blank=False)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now_add=True)
objects = MyUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
```
- 配置settings.py文件(建议使用
.env
文件、.ini
等方式配置以上的信息):
python
...
AUTH_USER_MODEL = 'myuser.MyUser'
...
4.2 示例2:继承AbstractUser
在这个示例中,我们使用了AbstractUser,并在模型中增加了一个avatar属性,用于存储用户头像。
-
创建django项目,定义应用,并在应用下创建自定义用户模型(models.py):
```python
from django.contrib.auth.models import AbstractUser
from django.db import modelsclass UserProfile(AbstractUser):
avatar = models.ImageField(upload_to='avatar', blank=False, null=True, verbose_name='头像')class Meta: verbose_name = '用户信息' verbose_name_plural = verbose_name def __str__(self): return self.username
```
-
配置settings.py文件。
python
...
AUTH_USER_MODEL = 'app.UserProfile'
...
这两个示例说明了对Django重写用户模型的两种方法的应用。继承AbstractBaseUser可以创建可以管理的模型,并增加必要的字段,而继承AbstractUser不需要改变管理模型,只需要在模型中增加自己的属性即可。根据实际需求选择不同的方法即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django 重写用户模型的实现 - Python技术站