2015-01-27 66 views
0

我有一個django 1.6應用程序,其中包含以下內容(爲清晰起見,已修剪) 已定義的類。用戶是標準的django.contrib.auth用戶類。如何在django中引用通過外鍵加入的模型管理員

class Event(models.Model): 
    user = models.ForeignKey(User, related_name='events') 
    name = models.CharField(max_length=64) 


class Profile(models.Model): 
    user = models.ForeignKey(User, related_name='aprofile') 


class MemberProfile(Profile): 
    pass 

這裏是我的管理類:

class ProfileAdmin(ModelAdmin): 
    model = Profile 
    fields = ('user',) 


class MemberProfileAdmin(ModelAdmin): 
    model = MemberProfile 
    fields = ('user',) 
    readonly_fields = ('user',) 

我想要做的是一個給定的成員,或至少資料中顯示的所有事件的只讀列表。當然,加入用戶外鍵似乎是要走的路,但我如何做到這一點卻空白。以下是迄今爲止的嘗試總結。

定義的事件類直接引用用戶領域的在線管理,並把它添加到ProfileAdmin:

class EventInlineAdmin(TabularInline): 
    model = Event 
    fk_name = 'user' # Fails - fk_name 'user' is not a ForeignKey to <class 'solo365.solo_profile.models.profile.Profile'> 

......哦,不,它肯定不是。但是,我們的用戶有一個「aprofile」字段,所以......

class EventInlineAdmin(TabularInline): 
    model = Event 
    fk_name = 'user__aprofile' # Fails - EventInlineAdmin.fk_name' refers to field 'user__aprofile' that is missing from model 'admin_fk_test.Event'. 

好,這些領域看起來像他們應該同步上漲,但也許我們需要多一點侵略性:

class EventInlineAdmin(TabularInline): 
    model = Event 
    fk_name = 'user__aprofile__pk' # Fails - 'EventInlineAdmin.fk_name' refers to field 'user__aprofile__pk' that is missing from model 'admin_fk_test.Event'. 

我也試着在formline_for_foreignkey()和inline和常規模型管理員的朋友中搞亂,但沒有fk_name有一個有效的值,那些方法永遠不會被調用。

我認爲然後嘗試直接從檔案的用戶訪問事件現場:

class ProfileAdmin(ModelAdmin): 
    model = Profile 
    fields = ('user', 'user__events') # Fails - Unknown field(s) (user__events) specified for Profile. Check fields/fieldsets/exclude attributes of class ProfileAdmin. 

什麼用自定義formfield_for_foreignkey()方法?可悲的是,除了「用戶」字段之外,其他任何事情都不會被調用。我也考慮過一個自定義的get_formsets()方法,但坦率地說,我不知道如何在沒有工作的EventInlineAdmin的情況下使用它。

我當然可以定義一個自定義字段,它可以簡單地連接所有事件並將其作爲字符串返回,但理想情況下我更喜歡像全功能內聯(甚至是隻讀)而不僅僅是一個塊o'文本。 IOW這樣的自定義字段將有一種方法,(理想情況下)將返回一個內聯表單,而不需要任何類型的自定義模板,設置allow_tags等。

我註定要爲Profile創建一個完全自定義的表單管理員類?還是有一個簡單的方法來完成我想要做的事情,我只是想念?

更新:如果所提供的解決方案適用於在MemberProfileAdmin類

獎勵積分,而不僅僅是ProfileAdmin類。

+0

我會親自重寫change_form.html中的每一個。所以在你的模板文件夾'/ templates/admin/AppName/modelname/change_form.html' –

+0

感謝您的回覆。這也發生在我身上,只是希望儘可能避免任何形式的自定義表單或模板。 – tbm

回答

0

UserProfile之間的關係應該是1:1關係,它將允許通過user__aprofile進行參照。否則,由於一個外鍵可以分配給多個實例,因此外鍵的反向關係是一個查詢集。這可能是你的代碼失敗的原因。

將其更改爲:

class Profile(models.Model): 
    user = models.OneToOneKey(User, related_name='aprofile') 

這是一個有點像使用ForeignKey(unique=True)

要知道這些屬性,可能有助於在有問題的模型實例上調用dir(model_instance),或者試用Django shell(./manage.py shell)。

另外,我已經體會到,如果您希望通過查看相關名稱來獲得一個配置文件,但實際上會返回一個查詢集,那麼可能會分配一個自定義的related_name,這會讓您感到更困惑。 在這種情況下生成的名稱將是profile_set,您將不得不打電話profile_set.all()profile_set.values()來獲得一些實際配置文件。