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

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

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

<code>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 = '用戶頭像')/<code>

那麼我們如何將這個模型內聯到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提供的方法內聯

<code># 應用目錄/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)/<code>

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

如果在這裡學到了知識,那麼請關注我或加入圈子一起交流學習,這裡將持續更新關於django的更多好內容。


分享到:


相關文章: