显示childs admin(list_display)中的父字段

时间:2011-02-01 21:20:12

标签: django django-models django-admin

以下是一些models.py

class Applicant(models.Model):
    name = models.CharField(...)
    email = models.CharField(...)

class Application(models.Model):
    applicant = models.ForeignKey(Applicant)
    text = models.TextField(...)

这是我的admin.py:

class ApplicationAdmin(model.ModelAdmin):
    list_display = ['text', *******]

admin.site.register(Application, ApplicationAdmin)

在ApplicationAdmin中,我想提交申请人姓名和电子邮件。

在问SO之前你有什么尝试?
我查看了以下代码,工作:

list_display = ['text', 'applicant__name','applicant__email']

我看过ModelAdmin.inlines但是可以看出,父/子关系必须颠倒过来。

有什么建议吗?如何在“应用程序”管理员中显示申请人姓名/电子邮件。可以使用新字段等迁移数据库。

2 个答案:

答案 0 :(得分:12)

你可以像list_display docs中的第四种可能性那样做。只需在您的Application模型中添加一个方法,如下所示:

class Application(models.Model):
    applicant = models.ForeignKey(Applicant)
    text = models.TextField(...)

    def applicant_name(self):
        return self.applicant.name
    applicant_name.short_description = 'Applicant Name'

    def applicant_email(self):
        return self.applicant.email
    applicant_email.short_description = 'Applicant Email'

然后您可以像这样设置ModelAdmin:

class ApplicationAdmin(model.ModelAdmin):
    list_display = ['text', 'applicant_name', 'applicant_email']

答案 1 :(得分:0)

如果您只需要在列表中显示它:

class Applicant(models.Model):
    name = models.CharField(...)
    email = models.CharField(...)

    def __unicode__(self):
        return "%s <%s>" % (self.name, self.email)

class ApplicationAdmin(model.ModelAdmin):
    list_display = ['text', 'applicant']

回答你的评论

  

但希望将每个字段作为管理员中的新行/行,而不是字符串。

不确定它是否是可用的最佳解决方案,但它会起作用:

class Application(models.Model):

    @property
    def applicant__name(self):
        return self.applicant.name

    # or maybe:

    def __getattr__(self, name):
        if name.startswith('applicant__'):
            return gettattr(self.applicant, 
                            name[len('applicant__'):])
        raise AttributeError()

class ApplicationAdmin(model.ModelAdmin):
    list_display = ['text', 'applicant__name']