Django2.0自定义用户模型

使用场景:用户模型新增字段(如增加昵称),两种方法
创建自定义模型,关联USER #使用这种方法
继承Django用户模型(在项目进行中不建议使用,会删除项目数据)

1,创建模型models.py

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


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    nickname = models.CharField(max_length=20, verbose_name='昵称')   #verbose_name把后台显示改成中文

    def __str__(self):
        return '' % (self.nickname, self.user.username)

在后台管理页面显示模型admin.py

from .models import Profile
from django.contrib import admin

@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    list_display = ('user', 'nickname')
zhonghao@zhonghao:~/Yzh_site$ python manage.py makemigrations     #生成数据库迁移文件
zhonghao@zhonghao:~/Yzh_site$ python manage.py migrate      #同步数据库

2,在后台用户模型里显示定义的nickname相关信息
用户模型在这里插入图片描述在之前admin.py基础上

from .models import Profile
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False

class UserAdmin(BaseUserAdmin):
    inlines = (ProfileInline, )
    list_display = ('username', 'nickname', 'email', 'is_staff', 'is_active', 'is_superuser')

    def nickname(self, obj):       #自定义一个nickname显示
        return obj.profile.nickname
    nickname.short_description = '昵称'  #后台用户模型nickname字段显示中文

admin.site.unregister(User)
admin.site.register(User, UserAdmin)


@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    list_display = ('user', 'nickname')

Django官网文档列子
扩展现有的用户(User)模型¶

有两种方法可以扩展默认的User模型,而不需要用你的模型来替换它。如果你需要改变的只是行为,并且不需要改变数据库存储的内容,那么你可以建立一个基于User模型的代理模型。它允许代理模型提供很多功能,包括默认排序,自定义的管理器和自定义的模型方法等。

如果你想存储与User模型关联的信息,可以使用OneToOneField到包含其他信息字段的模型。这种one-to-one模型经常被称作Profile模型,因为它可能存储站点用户的非身份验证的相关信息。比如你可以建立一个Employee模型:

from django.contrib.auth.models import User

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    department = models.CharField(max_length=100)


假设一个既有用户又有雇员模型的现有雇员Fred Smith,您可以使用Django的标准相关模型约定访问相关信息:

>>> u = User.objects.get(username='fsmith')
>>> freds_department = u.employee.department

添加资料(Profile)模型到管理后台的用户页面,需要定义一个 InlineModelAdmin (这个例子中,我们使用 StackedInline ) 到你的app里的admin.py中,并把它添加到 UserAdmin后,向 User 类注册:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

from my_user_profile_app.models import Employee

# Define an inline admin descriptor for Employee model
# which acts a bit like a singleton
class EmployeeInline(admin.StackedInline):
    model = Employee
    can_delete = False
    verbose_name_plural = 'employee'

# Define a new User admin
class UserAdmin(BaseUserAdmin):
    inlines = (EmployeeInline,)

# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

这些资料模型并不特殊,它们只是Django模型,用来一对一链接用户模型。因此,它们并不会在一个用户创立的时候自动生成,但可以使用 django.db.models.signals.post_save 来适当地创建或者更新相关模型。

使用相关模型会产生额外的查询或连接来检索相关数据。根据你的需求,一个自定义的用户模型包含相关联的字段可能是更好的选择,然而,与项目应用里的默认用户模型存在关联性可能会增加额外的数据库负载。

你可能感兴趣的:(学习)