码迷,mamicode.com
首页 > 其他好文 > 详细

django xadmin拓展User模型

时间:2019-04-22 21:18:37      阅读:395      评论:0      收藏:0      [点我收藏+]

标签:定义   名称   迁移   bsp   因此   object   migrate   而且   elf   

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

1.代理模型

2.Profile拓展模型User

3.AbstractBaseUser拓展模型User

4.AbstractUser拓展模型

之前想通过第四种方法拓展User模型,对原有User模型影响较少而且不需要创建数据表,但是由于项目的其他模型已经使用User作为一对多或者多对多的外键,导致替换过程有很多错误,没能解决而放弃该方法,所以建议大家在项目开始做前就使用该方法拓展User模型。

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

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中配置相关信息:

AUTH_USER_MODEL=user.MyUser

3.然后执行数据迁移

方法二: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的情况,因此在model中要指明其related_name的值,并且在ProfileInline中也要利用fk_name = ‘user‘来指定

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

参考官方文档:

技术图片

 

django xadmin拓展User模型

标签:定义   名称   迁移   bsp   因此   object   migrate   而且   elf   

原文地址:https://www.cnblogs.com/ttzz/p/10752776.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!