Django管理界面如何显示相关模型的字段

6

我希望在HostInfo的管理页面显示Hosts模型中的ip_address

# models.py
class Hosts(models.Model):
  host_name = models.CharField(max_length=200, unique=True)
  ip_address = models.GenericIPAddressField(protocol='both', unpack_ipv4=True)
  def __unicode__(self):
    return unicode(self.host_name)
  def hostip(self):
    return unicode(self.ip_address)

我在admin.py中有以下内容:

# admin.py
class HostInfoResource(resources.ModelResource):

    host = fields.Field(column_name='host',
                              attribute='host',
                              widget=ForeignKeyWidget(Hosts, 'host_name'))
    project = fields.Field(column_name='project',
                                attribute='project',
                                widget=ForeignKeyWidget(Project, 'project_name'))
    env = fields.Field(column_name='env',
                            attribute='env',
                            widget=ForeignKeyWidget(Env, 'env_name'))

    class Meta:
        model = HostInfo
        skip_unchanged = True
        import_id_fields = ('id', 'host','ticket','deployed_by')
        export_order = ('id', 'host', 'nexpose_level','cpus','memory','os',
                        'sudoers_copied', 'sudo_granted', 'extra_disks','app_type','app_name',
                        'vcenter_status','ticket','env','project','deployed_by',
                        'updated_on','created_on')

class HostInfoAdmin(ImportExportModelAdmin):
    resource_class = HostInfoResource
    list_display = ['id', 'host', 'nexpose_level','cpus','memory','os',
                        'sudoers_copied', 'sudo_granted', 'extra_disks','app_type','app_name',
                        'vcenter_status','ticket','env','project','deployed_by']

    readonly_fields = ('updated_on','created_on',)

admin.site.register(HostInfo, HostInfoAdmin)

我不太明白我需要做些什么才能达到这个目标。

1个回答

2

当您想在关系中进行嵌套时,请尝试使用双下划线。

class HostInfoAdmin(ImportExportModelAdmin):
    resource_class = HostInfoResource
    list_display = ['id','host__ip_address', 'host', 'nexpose_level','cpus','memory','os',
                        'sudoers_copied', 'sudo_granted', 'extra_disks','app_type','app_name',
                        'vcenter_status','ticket','env','project','deployed_by'] 

    def host__ip_address(self, obj):
        return obj.host.ip_address

<class 'inventory.admin.HostInfoAdmin'>: (admin.E108) 'list_display[1]' 的值引用了 'host__ip_address',但它既不是 'HostInfoAdmin' 的可调用函数,也不是其属性或方法,也不是 'inventory.HostInfo' 的属性或方法。 - Simply Seth
1
请查看这个链接,可能会有所帮助:https://dev59.com/dY_ea4cB1Zd3GeqPRKm3 - Darshan
1
那个链接给了我所需的答案。谢谢。 - Simply Seth
双下划线不是必需的,只要将任何字段名称定义为方法即可。 - charlee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接