前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django后台列表的自定义过滤条件显示

Django后台列表的自定义过滤条件显示

作者头像
IT不难
发布2023-11-17 14:06:31
1610
发布2023-11-17 14:06:31
举报
文章被收录于专栏:IT不难技术家园IT不难技术家园

前言

Django后台列表的自定义过滤条件显示,记录太多。只显示有用的信息。

自定义管理模型类

比如端口信息有很多,只显示存在线主机开放的端口信息。

代码语言:javascript
复制
# Register your models here.
class SPortAdmin(admin.ModelAdmin):
    #后台展示字段
    list_display = ['id','name', 'port', 'protocol', 'show_host_num', 'is_scanned']

    #排序
    ordering = ['id']

    #过滤字段
    list_filter = ['protocol', 'is_scanned']

    #搜索字段
    search_fields = ['port']


    # 定义一些操作示例
    @admin.display(description='主机数', ordering='id')
    def show_host_num(self, obj):
        host_count = Host.objects.filter(open_ports__in=[obj]).annotate(num_hosts=Count('id')).values('num_hosts')
        if host_count:
            return host_count[0]['num_hosts']
        else:
            return 0

    # 过滤, 只打印存在开放主机的端口列表
    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        queryset = queryset.annotate(num_hosts=Count('s_port')).filter(num_hosts__gt=0)  # 过滤出 num_hosts 大于 0 的记录
        return queryset
llqdk9jg.png
llqdk9jg.png

开放端口过滤器

通过开放端口筛选host记录,sport信息处于另一个模型,用到了过滤器功能。

代码语言:javascript
复制
#开放端口过滤器
class OpenPortsFilter(admin.SimpleListFilter):
    title = 'Open Ports'
    parameter_name = 'open_ports'

    def lookups(self, request, model_admin):
        open_ports = set(Host.objects.values_list('open_ports__port', flat=True).distinct())
        return ((port, port) for port in open_ports if port)

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(open_ports__port=self.value())


class HostAdmin(admin.ModelAdmin):
    #后台展示字段
    list_display = ['id', 'ip_address', 'status', 'project', 'is_monitor', 'operate']

    #过滤字段
    list_filter = ['project', OpenPortsFilter]

    #搜索字段
    search_fields = ['ip_address']

    #自定义动作
    actions = ['host_open_port_scan']

    # 定义一些操作示例
    @admin.display(description='操作', ordering='id')
    def operate(self, obj):
        if obj.open_ports.count() > 0:
            #端口列表
            paras = {'name':'开放端口', 'icon': 'fas fa-user-tie', 'url':'/monitor/listports/?hid={}'.format(obj.id)}
            portlist_btn = "端口列表"

            html_str = "" + portlist_btn +""
            return format_html(html_str, a_a=paras)
        else:
            return ""
llqdom0w.png
llqdom0w.png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年08月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 自定义管理模型类
  • 开放端口过滤器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档