下面详细讲解一下Django自定义用户表+自定义admin后台中的字段实例的完整攻略。
首先,在Django中自定义用户表时,需要继承Django默认的AbstractBaseUser和PermissionsMixin类,具体做法如下:
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.db import models
from django.utils import timezone
class MyUserManager(BaseUserManager):
def create_user(self, username, email, password=None,):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
username=username,
email=self.normalize_email(email),
is_active=True,
is_staff=False,
is_superuser=False,
last_login=timezone.now(),
date_joined=timezone.now(),
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, email, password):
user = self.create_user(
username=username,
email=self.normalize_email(email),
password=password,
)
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class MyUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=30, unique=True)
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
objects = MyUserManager()
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
def __str__(self):
return self.email
上面的代码中,我们通过使用MyUserManager类来定义create_user和create_superuser方法,从而实现了自定义用户表。
接下来,我们来讲解自定义admin后台中的字段实例。在Django中自定义admin后台中的字段时,可以通过修改ModelAdmin类中的list_display属性来实现。具体做法如下:
from django.contrib import admin
from .models import MyUser
class MyUserAdmin(admin.ModelAdmin):
list_display = ('id', 'username', 'email', 'is_active', 'is_staff', 'date_joined')
admin.site.register(MyUser, MyUserAdmin)
上面的代码中,我们在list_display属性中添加了我们自定义的字段,其中'id'字段、'username'字段、'email'字段、'is_active'字段、'is_staff'字段和'date_joined'字段分别对应用户的唯一标识符、用户名、邮箱、是否激活、是否是管理员和加入日期。这些字段可以根据自己的需求进行改动,从而实现自定义admin后台中的字段。
示例1:
假设我们的业务需要对用户的地址进行记录,因此需要在自定义用户表中添加一个地址字段。我们可以通过在MyUser类中添加address字段来实现:
class MyUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=30, unique=True)
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
address = models.CharField(max_length=255, blank=True, null=True)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
objects = MyUserManager()
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
def __str__(self):
return self.email
然后,我们需要在自定义admin后台中显示这个地址字段。我们可以在MyUserAdmin类中的list_display属性中添加'address'字段:
class MyUserAdmin(admin.ModelAdmin):
list_display = ('id', 'username', 'email', 'is_active', 'is_staff', 'date_joined', 'address')
这样,在自定义admin后台中就能显示用户的地址了。
示例2:
假设我们的业务需要记录用户最后一次登录的时间。我们可以通过在MyUser类中添加last_login_time字段来实现:
class MyUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=30, unique=True)
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
address = models.CharField(max_length=255, blank=True, null=True)
last_login_time = models.DateTimeField(default=timezone.now)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
objects = MyUserManager()
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
def __str__(self):
return self.email
然后,我们需要在自定义admin后台中显示这个last_login_time字段。我们可以在MyUserAdmin类中的list_display属性中添加'last_login_time'字段:
class MyUserAdmin(admin.ModelAdmin):
list_display = ('id', 'username', 'email', 'is_active', 'is_staff', 'date_joined', 'address', 'last_login_time')
这样,在自定义admin后台中就能显示用户最后一次登录的时间了。
总结:
通过以上两个示例,我们可以看到,通过在自定义用户表中添加字段和在自定义admin后台中添加字段,可以实现非常灵活的自定义需求。同时,以上的代码也展示了如何通过修改list_display属性来自定义admin后台中的字段,这对于开发和维护Django应用程序是非常有帮助的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django自定义用户表+自定义admin后台中的字段实例 - Python技术站