django显示内容manytomanyfield

时间:2010-08-12 08:35:27

标签: django django-models django-admin

我正在尝试在管理界面中显示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')

此方法适用于显示Foreignkey数据。显然这不适用于ManytoManyFields ..所以我的问题是,如何在我的管理页面下显示我的组名。所以,当我点击“会员”的管理员时,我想立即看到由多人关系耦合的群组名称的内容?

UPDATE !!! - 我不想在我的更改页面中显示它们只是想在表格中看到结果。我发现了这个,这几乎是我想要的:

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

这有效,但视图有点奇怪,它显示了这样的东西:

<Group: Administrators >]

问题是,我不想看到那些'[Group:'和'&gt;]',所以我该如何摆脱这些?

UPDATE2 !!!

它帮助了我,但如果发生这种情况怎么办?我有一个名为Test的第三个表就像这样:

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

现在我想在管理视图'测试'中显示表'组'中的组名,这怎么可能?

感谢任何帮助。

此致 Ť

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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值

更新:

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是一个外键,因此使用“。”时没有问题。使用外键关系的表示法。