Django管理系统:在另一个模型上关联字段。

3

以下是我的模型:

class Location(models.Model): 
    location_id = models.AutoField(primary_key=True)
    location = models.CharField(max_length=30, blank=False, null=False)

class Host(models.Model): 
    host_id = models.AutoField(primary_key=True)
    location = models.ForeignKey('Location', on_delete=models.PROTECT)
    host = models.CharField(max_length=30, blank=False, null=False)

class Device(models.Model):
    device_id = models.AutoField(primary_key=True)
    host = models.ForeignKey('Host', on_delete=models.PROTECT)
    model = models.ForeignKey('Model', on_delete=models.PROTECT)
    ip = models.GenericIPAddressField(null=True)
    name = models.CharField(max_length=30, blank=False, null=False)

以下是 DeviceAdmin 类:

class DeviceAdmin(admin.ModelAdmin):
    list_display=('host','name','model', 'ip')
    list_filter=(
        ('model', admin.RelatedOnlyFieldListFilter),
        ('host', admin.RelatedOnlyFieldListFilter),
    )    
admin.site.register(Device, DeviceAdmin)

我需要在设备管理员页面上看到位置查找字段。然而,位置主机相关联而非设备

如何显示位置字段以通过位置->主机筛选设备类别并在设备管理员页面上呈现?

1个回答

5
您可以在“list_filters”中链接字段,并在“list_display”中使用ModelAdmin方法:
class DeviceAdmin(admin.ModelAdmin):
    list_display = ('host', 'host_location', 'name', 'model', 'ip')
    list_filter = (
        ('model', admin.RelatedOnlyFieldListFilter),
        ('host', admin.RelatedOnlyFieldListFilter),
        'host__location',
    )

    def host_location(self, instance):
        return instance.host.location
    host_location.short_description = "Location"
    host_location.admin_order_field = 'host__location'
admin.site.register(Device, DeviceAdmin)

更新 根据评论讨论

要过滤外键(包括任何字段和链接关系),您应该查找提供自动完成的工具。例如:django-autocomplete-light。这将使您能够呈现此类小部件:

enter image description here

注意:自Django 2.0以来,django-admin提供自动完成字段相同的功能,而且代码更少。


是的,我测试过了。错误是:无法将“location”关键字解析为字段。可选项包括:device_id,host,host_id,... - Vladimir Akkerman
有一些我没有发布的其他字段。 - Vladimir Akkerman
不行。但是当我从筛选器中删除 ('host__location', admin.RelatedOnlyFieldListFilter) 时,它可以工作。但这样一来,在设备编辑操作中,我就无法获得下拉式位置字段了。 - Vladimir Akkerman
1
啊,好的,你需要在更改表单中吗?不是在更改列表中?对于这个问题,我认为最好依赖于django-autocomplete-light。这可以让你使用自动完成来呈现选择小部件。因此,您将能够输入位置名称以过滤匹配的主机。 - Antoine Pinsard
1
这是我的一个Django项目的示例:http://i.imgur.com/jXDstVm.png - Antoine Pinsard
显示剩余9条评论

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