Django如何將一對一關係添加爲管理員內聯?

django默認幫我們內置了一個用戶的User模型,其中包含了基礎的用戶字段,比如用戶名,密碼,郵箱等幾個基礎字段,但這在實際開發過程中這幾個字段遠遠不能滿足我們的要求,那麼我們一般的做法便是通過一對一關係來擴充User模型,那麼我們如何將擴充的模型內聯到admin後臺的User模型下呢?

假如我們有一個這樣的UserProfile模型,它與User具有一對一的關係:

class UserProfile(models.Model):
    owner = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='用戶')
    nike_name = models.CharField('暱稱', max_length=23, blank=True, default='')
    birthday = models.DateField('生日', null=True, blank=True)
    address = models.CharField('地址', max_length=100, blank=True, default='')
    image = models.ImageField(upload_to='images/%Y/%m', default='images/default.png', max_length=100, verbose_name = '用戶頭像')

那麼我們如何將這個模型內聯到User模型下呢?

Django如何將一對一關係添加爲管理員內聯?

管理員後臺默認註冊的User

打開admin後臺我們發現默認django已經幫我們在後臺註冊了User模型,這是因爲我們利用命令創建項目的時候自動生成的項目文件夾下的settings.py文件中默認註冊了django爲我們提供的認證權限模塊。

Django如何將一對一關係添加爲管理員內聯?

settings.py中插入了認證授權系統

瞭解了這個機制之後我們再來內聯,思路就會清晰很多。

1、首先,在應用的admin.py中引入User模型類和官方用來將User模型類註冊到後臺的UserAdmin

2、再引入我們通過一對一關聯User的UserProfile模型類

3、先刪除管理員後臺註冊的User應用

4、通過django提供的方法內聯

# 應用目錄/admin.py    完整代碼

from django.contrib import admin
from django.contrib.auth.models import User
# Register your models here.
from .models import UserProfile

# 我們看到的這個用戶選項就是官方默認通過UserAdmin這個類註冊到後臺的,那麼我們也引入進來,後邊繼承這個類
from django.contrib.auth.admin import UserAdmin

# 刪除管理員後臺默認註冊的User應用
admin.site.unregister(User)

# 定義關聯對象的樣式,StackedInline爲縱向排列每一行,TabularInline爲並排排列
class UserProfileInline(admin.StackedInline):
    model = UserProfile   # 關聯的模型

# 關聯UserProfile,這裏繼承UserAdmin
class UserProfileAdmin(UserAdmin):
    # 內聯UserProfile
    inlines = [UserProfileInline]

# 註冊User模型
admin.site.register(User, UserProfileAdmin)

大家注意,這裏有個知識點就是刪除管理員站點默認的應用的方法unregister,具體用法大家看代碼即可。到這裏我們就成功內聯進去了,使其在管理員後臺看起來更像一個整體。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章