2010-08-12 103 views
2

我試圖顯示管理界面中的manytomanyfield的內容。我有以下代碼:django顯示內容manytomanyfield

class Member(models.Model): 
    group = models.ManyToManyField('Group') 

    def group_gp_name(self): 
     return self.group.gp_name 

    def __unicode__(self): 

     return u'%s' % (self.id) 

class Group(models.Model): 
    gp_name = models.TextField(verbose_name=u'Group Name') 

    def __unicode__(self): 
     return u'%s - %s' % (self.id, self.gp_name) 

在管理我有這樣的事情:

class MemberAdmin(admin.ModelAdmin): 
    list_display = ('group_gp_name') 

此方法處理爲外鍵顯示數據。顯然,這不適用於ManytoManyFields ..所以我的問題是,我怎樣才能顯示我的組名在我的管理員頁下的成員。所以,當我點擊'會員'的管理員時,我想立即看到由多人關係加上的組名的內容?

更新! - 我不想在我的更改頁面中顯示它們只是想在表格中看到結果。我發現這一點,它幾乎是我想要什麼:

def get_sol(self): 
     return self.group.all() 

這工作,但認爲是有點怪異,它顯示了這樣的事情:

<Group: Administrators >] 

的問題是,我不希望看到那些'[Group:'和'>]',那麼我該如何擺脫這些?

UPDATE2 !!!

它幫了我,但如果發生這種情況呢?我有一個名爲Test這樣的第3表:

class Test(models.Model): 
    member = models.ForeignKey('Member') 

現在,我想在管理視圖「測試」從表「組」組名顯示,這怎麼可能?

任何幫助表示讚賞。

問候, 牛逼

+0

我編輯了我的答案 - 讓我知道它是否適合你! – 2010-08-12 08:51:01

回答

0

如果你想看到你的多對多字段從更改頁面,那麼你需要使用admin inlines

class GroupInline(admin.TabularInline): 
    model = Group 

class MemberAdmin(admin.ModelAdmin): 
    list_display = ('group_gp_name') 
    inlines = [ 
     GroupInline, 
    ] 

發表您的更新,您感興趣的列表顯示而不是更改頁面,請嘗試更改get_sol到:

def get_sol(self): 
    return '; '.join([group.gp_name for group in self.group.all()]) 

安置自己的第二次更新,在Test添加一個方法:

class Test(models.Model): 
    member = models.ForeignKey('Member') 

    def get_member_sol(self): 
     return self.member.get_sol() 
+0

你能看看我的update2嗎?你的解決方案在 – Thomas 2010-08-12 09:14:02

+0

@Thomas完成。 – 2010-08-12 09:17:35

+0

非常感謝,這很棒!我正在理解這種行爲。無論如何,當我想從許多領域取得值時,我可以在視圖中使用這樣的東西嗎? test = Test.objects.get(id = 1) solutuion = test.member.group.gp_name 這讓我把與該對象相關的解決方案變成一個沒有任何'[Group'和'>]'括號的變量還是有另一種方法呢? – Thomas 2010-08-12 09:26:30

0

你不能像那樣使用它。因爲ManyToManyFields創建一個intermadiate表來連接兩個表。所以小組可能會返回多個結果。

def group_gp_name(self): 
    a = self.group.select_related() 
    # this will return you a list, so 
    return ','.join(x.gp_name for x in a) 

這將返回相隔所有相關pg_name值(,)

UPDATE:

class Test(models.Model): 
    member = models.ForeignKey('Member') 


def get_gp_name(self): 
    ','.join(x.gp_name for x in self.member.group.select_related()) 

由於msmber是一個外鍵,你沒有使用有問題的 「」使用外鍵關係的符號。

+0

來寫一個提示,我分爲兩個單獨的函數,當然你可以使用return','join(x.gp_name代替self.group.select_related()中的x) – FallenAngel 2010-08-12 09:02:18

+0

請你看看我的UPDATE2,你的解決方案效果很好 – Thomas 2010-08-12 09:13:43