django xadmin拓展User模型

django提供四种拓展模型的方法:python

1.代理模型django

2.Profile拓展模型Userapp

3.AbstractBaseUser拓展模型Userspa

4.AbstractUser拓展模型代理

以前想经过第四种方法拓展User模型,对原有User模型影响较少并且不须要建立数据表,可是因为项目的其余模型已经使用User做为一对多或者多对多的外键,致使替换过程有不少错误,没能解决而放弃该方法,因此建议你们在项目开始作前就使用该方法拓展User模型。code

下面简单介绍一下该方法:blog

1.新建APP user,在user的model.py文件下定义模型MyUser:文档

class MyUser(AbstractUser):
    qq = models.CharField('QQ号码',max_length=16)

    def __str__(self):
        return self.username

2.在项目的setting.py中配置相关信息:it

AUTH_USER_MODEL='user.MyUser'

3.而后执行数据迁移io

方法二:Profile拓展模型User

该方法会新建数据表,适合用在项目完成过程当中

1.建立app UserProfile,在他的model.py文件下添加以下代码:

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

# Create your models here.

class UserProfile(models.Model):
    user = models.OneToOneField('auth.User',related_name='profile_user')
    pid = models.ForeignKey('auth.User',verbose_name='上级用户',related_name='profile_pid')

    class Meta:
        db_table = "bjra_userprofile"

2.执行数据迁移:python manage.py makemagrations  和 python manage.py migrate

3.添加以及修改时将其添加到界面中,须要从新注册User模型

在UserProfile/adminx.py文件夹下添加

class ProfileInline(object):
    model = UserProfile
    fk_name = 'user'
    #raw_id_fields = ("pid",)
    verbose_name = '上级用户'
    verbose_name_plural = verbose_name
class UserProfileAdmin(object):
    inlines = [ProfileInline]
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
xadmin.site.unregister(User)  #去掉在admin中的注册
xadmin.site.register(User, UserProfileAdmin)  #用userProfileAdmin注册user

遇到的问题:因为UserProfile模型中存在多个外键关联同一模型User的状况,(第一个user与User模型是一对一关系,pid是指该用户的上级用户,所以是User的外键)所以在model中要指明其related_name的值,而且在ProfileInline中也要利用fk_name = 'user'来指定

(模型上的外键名称。在大多数状况下,将自动处理,但fk_name若是同一父模型有多个外键,则必须明确指定。)

参考官方文档:

相关文章
相关标签/搜索