2014-10-31 88 views
0

在我的模型中,您可以看到我有一個與UserProfile具有OneToOne關係的SpecializedProfile,與django用戶模型具有OneToOne關係。Django Admin與OneToOne字段一致

我想創建一個包含UserProfile和django用戶模型內聯的SpecializedProfile的管理員,以便我可以一次創建一個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字段被定義的模型上,並且不會交流切入反向關係。我寧願不必重構我的模型來完成這項工作......有什麼我可以做的,以使內聯原型與我的模型一起工作?

回答

-1

有沒有辦法nested inlines (inline inside inline)django.contrib.admin

也許這可以幫助您:

class UserInline(admin.TabularInline): 
    model = User 

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

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

你想也需要提供自己的模板,將嵌套迭代在兩個頂級在線和它的孩子直列。

也看看this,也許幫助你。

0

我固定的錯誤通過使背面內嵌,而不是從個人資料到用戶,但是從覆蓋的用戶對配置文件:

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) 

然後,我還調整了檔案管理(刪除添加操作,改變了一些外地的鏈接定製那些)。

0

在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) 

這樣一來,你可以同時爲用戶配置和SpecializedProfile內嵌視圖的一切。

相關問題