2010-08-12 5 views
2

Я пытаюсь показать содержимое многотонового поля в интерфейсе администратора. У меня есть следующий код:django display content 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 .. так что мой вопрос в том, как я могу показать свои имена групп на моей странице администратора в разделе Member. Поэтому, когда я нажимаю на admin на «Member», я хочу сразу увидеть содержимое имен групп, связанных многими отношениями manytomany?

ОБНОВЛЕНИЕ !!! - Я не хочу показывать их на моей странице изменения, просто хочу увидеть результат в таблице. Я нашел это, и это почти то, что я хочу:

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

Это работает, но мнение это немного странно, это показывает, что-то вроде этого:

<Group: Administrators >] 

Проблема заключается в том, я не хочу увидеть эти «[Группа:» и «>]», так как я могу избавиться от них?

UPDATE2 !!!

Это помогло мне, но что, если, например, это произойдет? У меня 3-й стол под названием Test, как это:

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

Теперь я хочу показать в окне администратора «Test» название группы из таблицы «Group», как это возможно?

Любая помощь приветствуется.

С уважением, T

+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() 
+0

Не могли бы вы посмотреть мое обновление2, пожалуйста? Ваше решение сработало так же, как и – Thomas

+0

@ Томас. –

+0

Большое спасибо, что отлично работает! Я понимаю, что такое поведение. В любом случае, когда я хочу получить значения из поля manytomany, могу ли я просто использовать что-то подобное в представлении? test = Test.objects.get (id = 1) solutuion = test.member.group.gp_name Это дает мне решение, связанное с этим объектом, в переменную без каких-либо «скобок [Group» и «>]» или есть другой метод для этого? – Thomas

0

Вы не можете использовать его так. Поскольку ManyToManyFields создает межмагистральную таблицу для подключения двух таблиц. Таким образом, группа может вернуть более одного результата.

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 является ForeignKey, вы не имеете проблему с помощью "" обозначение для использования отношения foreignkey.

+0

, чтобы написать рвоту, я делю функцию в двух отдельных строках, конечно, вы можете использовать return ','. Join (x.gp_name для x в self.group.select_related()) вместо – FallenAngel

+0

Не могли бы вы посмотреть мой UPDATE2, пожалуйста, ваше решение отлично поработало! – Thomas

Смежные вопросы