📜  django 扩展用户模型 - Python (1)

📅  最后修改于: 2023-12-03 15:30:30.388000             🧑  作者: Mango

Django扩展用户模型

在Django中,用户模型是通过django.contrib.auth.models.AbstractBaseUser来定义的,其中包含了一些基本的字段和方法,比如用户名、密码验证等。但是,在一些应用中,可能需要添加一些其他的用户信息,比如性别、年龄、地址等等。这时候就需要扩展Django的用户模型。

本文将介绍如何在Django中扩展用户模型,并提供一些实用的扩展方法和技巧。

新建用户模型

首先,我们需要新建一个用户模型。在models.py中定义一个新的用户模型,例如:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    age = models.PositiveIntegerField(null=True, blank=True)
    gender = models.CharField(max_length=10, null=True, blank=True)
    address = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        return self.username

在这个例子中,我们继承了AbstractUser,并添加了一些新的字段,比如agegenderaddress。这些字段是可选的,并且可以为空。

创建用户表

接下来,我们需要创建用户表。在settings.py中添加以下代码:

AUTH_USER_MODEL = 'app.CustomUser'

其中,app是你的应用的名称,CustomUser是我们刚刚定义的新的用户模型的名称。

然后,在命令行中运行以下命令:

python manage.py makemigrations
python manage.py migrate

这样就可以创建用户表并迁移数据库了。

扩展表单

在Django中,用户注册和编辑都需要表单。虽然Django提供了默认的表单UserCreationFormUserChangeForm,但是这些表单只包含了基本的字段,无法满足我们的需求。因此,我们需要扩展这些表单。

注册表单

我们可以新建一个注册表单CustomUserCreationForm,并继承UserCreationForm。然后,通过Meta类指定我们需要显示的字段,例如:

from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = CustomUser
        fields = UserCreationForm.Meta.fields + ('age', 'gender', 'address',)

在这个例子中,我们添加了agegenderaddress字段到注册表单中。

编辑表单

类似地,我们可以新建一个编辑表单CustomUserChangeForm,并继承UserChangeForm。然后,通过Meta类指定我们需要显示的字段,例如:

from django.contrib.auth.forms import UserChangeForm
from .models import CustomUser

class CustomUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = CustomUser
        fields = UserChangeForm.Meta.fields + ('age', 'gender', 'address',)

在这个例子中,我们添加了agegenderaddress字段到编辑表单中。

扩展管理器

默认情况下,Django提供了一个UserManager用于创建和管理用户。但是,我们可能需要自定义一个管理器来实现一些特定的功能,比如按照年龄和性别筛选用户。

我们可以新建一个自定义管理器CustomUserManager,并继承UserManager。然后,添加我们需要的方法,例如:

from django.contrib.auth.models import UserManager

class CustomUserManager(UserManager):
    def filter_by_age_and_gender(self, age, gender):
        return self.filter(age=age, gender=gender)

在这个例子中,我们添加了一个filter_by_age_and_gender方法,用于按照年龄和性别筛选用户。

总结

在本文中,我们学习了如何在Django中扩展用户模型,并提供了一些实用的扩展方法和技巧。通过扩展用户模型,我们能够为应用添加更多的用户信息,并定制用户注册和编辑表单。同时,通过自定义用户管理器,我们可以实现一些特定的用户查询功能。