在admin listview中显示外键对象的数量

时间:2012-01-21 18:31:31

标签: django

我有一个竞赛模型,它有一个相应的CompetitionEntry模型。我想在管理视图中显示每个比赛的参赛人数。

以下是模型定义:

class Competition(models.Model):

    def __unicode__(self):
        return self.competition_name

    competition_name = models.CharField(max_length=100)
    competition_text = models.TextField()
    active = models.BooleanField('Is this competition active?', blank=True)
    date_posted = models.DateTimeField(auto_now_add=True)

class CompetitionEntry(models.Model):

    def __unicode__(self):
        return self.competition.competition_name

    competition = models.ForeignKey(Competition)
    user = models.ForeignKey(User)
    date_entered = models.DateTimeField(auto_now_add=True)
    is_winner = models.BooleanField('Is this entry the winner?', blank=True)

我的Django技能有点生疏,但应该有一个相当简单的方法将其添加到管理员,对吧?有什么指针吗?我无法弄清楚竞赛课如何与“竞赛”课程“谈话”,因为竞赛是在竞赛内部定义的,但我想在竞赛中展示参赛作品。

1 个答案:

答案 0 :(得分:1)

您可以在ModelAdmin中引用python函数,方法是将其添加到fieldsetslist_displayreadonly_fields属性中。

您可以通过动态添加到外键所指向的每个类的反向相关管理器“反对”反向关系,默认情况下为lowercasemodelname_set,其行为与默认objects完全相同管理器。

class MyAdmin(admin.ModelAdmin):
    list_display = ('_competition_count',)
    readonly_fields = ('_competition_count',)

    fieldsets = (
        (None, {'fields': (
            '_competition_count',
        )})
    )

    def _competition_count(self, obj):
        return obj.competitionentry_set.count()
    _competition_count.short_description = "Competition Count"