以下是一些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但是可以看出,父/子关系必须颠倒过来。
有什么建议吗?如何在“应用程序”管理员中显示申请人姓名/电子邮件。可以使用新字段等迁移数据库。
答案 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']