2012-10-04 51 views
1

我正在尝试使用list_display访问admin中的字段。根据文档:(https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display),不支持ManyToManyFields。我已经通过创建这样一个自定义的方法解决此得到:Django:在list_display中显示ManyToManyField和一般关系

#models.py 
class Gig 
    musician = models.ManyToManyField(Musician) 
    note = models.CharField(max_length=20) 

    def __unicode__(self): 
     return u'%s' % (self.note) 

    def gig_musicians(self): 
     return self.musician.all() 

#admin.py 
class GigAdmin 
    list_display = ('note', 'gig_musicians') 

这给了我,我要找的结果,但它是很丑陋(这适用于一般的关系也是如此)。结果看起来像:

[<Musician: Richard Bona>, <Musician: Bobby Mcerrin>] 

我认为这是因为我如何建立的方法。你有什么建议如何使这更优雅,即只是名称?

我尝试过其他解决方案,比如, django display content of a manytomanyfield,但我无法得到它的工作对我来说(它只是显示无)

回答

5

您当前gig_musicians返回QuerySet,而不是一个字符串。

试试这个gig_musicians功能:

def gig_musicians(self): 
    return ', '.join([obj.name for obj in self.musician.all()]) 
+0

谢谢!这适用于我的大多数模型。对于音乐家而言,名称字段与个人即OneToOne的关系,即'name = models.OneToOneField(Individual)',所以当我使用你的代码时,我得到了错误:expect string,Individual found。我试图将其修改为'([obj.individual.name obj in self.musician.all()])''但这并不起作用。有什么建议? –

+0

更新:我收到此错误的任何字段不是CharField –

+1

您的OneToOne关系有点奇怪。你的音乐家应该有一个像“个人= models.OneToOneField(个人)”的字段。如果你的个人模型有一个像name = models.Charfield(...)这样的名字字段,那么你的代码就可以工作。 – Jingo

相关问题