对django内置的User模型进行自定义扩展可以使用Django提供的User模型扩展机制。下面详细讲解对django内置的User模型进行自定义扩展方式的完整攻略。
一、创建扩展模型
第一步是创建扩展模型,继承自Django内置的User模型,并添加想要扩展的字段。这里我们以添加nickname为例。创建一个新的app,这里我们取名为account:
# account/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
nickname = models.CharField(max_length=50, blank=True)
上面的代码中,User继承自Django内置的AbstractUser模型,添加了一个CharField类型的nickname字段。blank=True表示该字段可以为空。
二、修改settings.py
第二步是修改settings.py文件来使用我们定义的User模型。
# settings.py
AUTH_USER_MODEL = 'account.User'
三、进行数据库迁移
第三步是进行数据库迁移。进入项目根目录,运行以下命令:
python manage.py makemigrations
python manage.py migrate
四、使用扩展模型
现在我们可以使用扩展后的User模型了。例如,我们可以在视图里使用以下代码获取当前用户的nickname:
# views.py
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
@login_required
def home(request):
nickname = request.user.nickname
return render(request, 'home.html', {'nickname': nickname})
五、添加扩展字段到django admin
如果想在后台管理界面(django admin)中看到扩展的字段,需要进行如下配置:
# admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
class CustomUserAdmin(UserAdmin):
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'nickname')
fieldsets = UserAdmin.fieldsets + ((None, {'fields': ('nickname',)}),)
admin.site.register(User, CustomUserAdmin)
在上面的代码中,我们继承自Django内置的UserAdmin,然后添加了nickname字段到显示列表(list_display)和输入表单(fieldsets)中。最后,我们通过admin.site.register()将扩展的User模型注册到后台管理界面。
六、使用信号扩展User模型
除了继承AbstractUser创建扩展模型外,还可以使用信号扩展User模型。下面我们以添加一个is_vip字段为例来演示。
# account/signals.py
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
is_vip = models.BooleanField(default=False)
@receiver(post_save, sender=User)
def create_or_update_userprofile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
instance.profile.save()
UserProfile是一个扩展了User模型的模型。我们使用了Django提供的post_save信号和一个接收器(receiver)create_or_update_userprofile来自动创建或更新用户的UserProfile。在接收器中,我们首先判断是否是创建用户,如果是,则创建一个UserProfile,否则更新已有的UserProfile。最后,我们通过instance.profile.save()来保存UserProfile。要使用UserProfile,需要在User模型中添加一个OneToOneField,来关联UserProfile。
# account/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
from .signals import create_or_update_userprofile
class User(AbstractUser):
nickname = models.CharField(max_length=50, blank=True)
profile = models.OneToOneField('UserProfile', on_delete=models.CASCADE, null=True)
# signals.py中的接收器需要在models.py中引入才能生效
models.signals.post_save.connect(create_or_update_userprofile, sender=User)
最后,我们需要在models.py中,导入signals.py中的接收器,并将接收器连接到User模型的post_save信号上。
这就是使用信号扩展User模型的完整攻略。
以上两条示例提供了两种扩展User模型的方法,你可以选择其中一种来实现自定义扩展。无论你选择哪一种,都需要在项目中使用扩展的User模型。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django之对django内置的User模型进行自定义扩展方式 - Python技术站