2010-08-12 84 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