【问题标题】:Django admin related Field over another model另一个模型上的 Django 管理员相关字段
【发布时间】:2016-06-30 15:57:45
【问题描述】:

这是我的模型:

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)

我需要在设备管理页面上查看位置查找字段。但是,LocationDevice 的关系超过了 Host

如何在设备管理页面上显示Location 字段以按位置->主机过滤设备类?

【问题讨论】:

    标签: django model foreign-keys


    【解决方案1】:

    您可以在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)
    

    更新在cmets讨论后

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

    注意:自 Django 2.0 起,django-admin provides autocomplete fieldsdjango-autocomplete-light 一样,开箱即用,代码更少。

    【讨论】:

    • 我犯了一个错误,你用我最新的编辑测试了吗?如果是这样,您能否提供有关该错误的更多详细信息?
    • 是的,我测试过了。错误是:无法将关键字“位置”解析为字段。选项有:device_id、host、host_id、...
    • 需要完整的堆栈跟踪。看起来你有list_display = ('host', 'location', 'name', 'model', 'ip'),而不是list_display = ('host', 'host_location', 'name', 'model', 'ip')
    • 啊,好的,您需要在更改表单中使用它吗?不在变更清单上?为此,我认为最好的方法是依赖django-autocomplete-light。这使您可以使用自动完成来呈现选择的小部件。因此,您将能够输入位置名称来过滤匹配的主机。
    • 这是一个示例,来自我的一个 django 项目:i.imgur.com/jXDstVm.png
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2015-12-23
    • 2013-06-12
    相关资源
    最近更新 更多