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若是同一父模型有多個外鍵,則必須明確指定。)

參考官方文檔:

相關文章
相關標籤/搜索