簡體   English   中英

Django Admin內嵌OneToOne字段

[英]Django Admin Inlines With OneToOne Field

在我的模型中,您可以看到我的SpecializedProfile與UserProfile具有OneToOne關系,與django用戶模型具有OneToOne關系。

我想為SpecializedProfile創建一個包含UserProfile和django User模型的內聯的管理員,以便我可以一次全部創建SpecializedProfile,而無需轉到UserProfile頁面和User頁面。

這是我的模型:

class UserProfile(models.Model):
    user_auth = models.OneToOneField(User, related_name="profile", primary_key=True)
    # more fields...


class SpecializedProfile(models.Model):
    profile = models.OneToOneField(UserProfile, related_name="specialized_profile", primary_key=True)
    # More fields...

這是我嘗試創建管理員的嘗試:

class UserInline(admin.TabularInline):
    model = User
    fk_name = 'profile__specialized_profile'

class ProfileInline(admin.TabularInline):
    model = UserProfile
    fk_name = 'specialized_profile'

class SpecializedProfileAdmin(admin.ModelAdmin):
    model = SpecializedProfile
    inlines = [
        UserInline, ProfileInline
    ]

admin.site.register(SpecializedProfile, SpecializedProfileAdmin)

管理員無法正常工作,並且出現此錯誤:

<class 'profiles.admin.ProfileInline'>: (admin.E202) 'profiles.UserProfile' has no field named 'trainer'.
<class 'profiles.admin.UserInline'>: (admin.E202) 'auth.User' has no ForeignKey to 'profiles.SpecializedProfile'.

django似乎希望將內聯線放在定義OneToOne字段的模型上,並且不接受反向關系。 我寧可不必重組模型來完成這項工作...我可以做些什么來使內聯按原樣使用我的模型嗎?

我通過使背面內聯而不是從個人資料到用戶而是從覆蓋的用戶到個人資料來內聯來解決該錯誤:

class ProfileInline(admin.StackedInline):
    model = Profile

class IspUserAdmin(UserAdmin):
    list_display = ('username', 'first_name', 'last_name', 'email', 'is_staff', 'is_superuser', 'is_active')
    list_filter = ('date_joined', 'last_login', 'is_staff', 'is_superuser', 'is_active',)
    inlines = (ProfileInline,)

admin.site.unregister(User)
admin.site.register(User, IspUserAdmin)

然后,我還調整了Profile admin(刪除了Add操作,並將某些字段鏈接更改為自定義鏈接)。

github上有一個django模塊,可以為您完成此操作,而無需撤銷關系: django_reverse_admin

安裝后,您的管理員將如下所示:

# admin.py
from django_reverse_admin import ReverseModelAdmin


class SpecializedProfileAdmin(ReverseModelAdmin):
    model = SpecializedProfile
    inline_reverse = ['profile']
    inline_type = 'tabular'  # could also be 'stacked'

admin.site.register(SpecializedProfile, SpecializedProfileAdmin)

不幸的是,我不認為它可以嵌套內聯(Django也不能),因此只能解決部分問題。 我知道您不想更改數據庫結構,但是SpecializedProfile實際上似乎更像是UserProfile的子類。 如果您像這樣重寫模型:

class SpecializedProfile(UserProfile):
    # More fields...

然后,您可以像這樣的管理員:

# admin.py
from django_reverse_admin import ReverseModelAdmin

class UserProfileAdmin(ReverseModelAdmin):
    model = UserProfile
    inline_reverse = ['user_auth']
    inline_type = 'tabular'


class SpecializedProfileAdmin(ReverseModelAdmin):
    model = SpecializedProfile
    inline_reverse = ['user_auth']
    inline_type = 'tabular'

admin.site.register(SpecializedProfile, SpecializedProfileAdmin) 
admin.site.register(UserProfile, UserProfileAdmin)

這樣,您可以內聯查看UserProfile和SpecializedProfile的所有內容。

django.contrib.admin沒有nested inlines (inline inside inline)的方法。

也許這可以幫助您:

class UserInline(admin.TabularInline):
    model = User

class ProfileInline(admin.TabularInline):
    model = UserProfile
    inlines = [UserInline]

class SpecializedProfileAdmin(admin.ModelAdmin):
    model = SpecializedProfile
    inlines = [ProfileInline]

您還需要提供自己的模板,這些模板將在頂級內聯和子內聯上嵌套嵌套迭代。

也看看這個 ,也許對你有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM