You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Django Admin列表筛选:按Company ID筛选但显示名称的实现问询

解决Django Admin中按公司实例精准筛选且显示名称的问题

这个需求我之前处理过,直接用company__name会因为同名公司无法精准筛选,换成company__id又会显示冰冷的ID,确实有点头疼。最完美的解决方案是自定义Django Admin的筛选器,让筛选逻辑基于公司ID(保证精准),但筛选选项显示公司名称(方便用户操作)。

具体实现步骤

  1. 导入必要模块
    在你的admin.py文件开头,导入SimpleListFilter以及对应的模型:

    from django.contrib import admin
    from django.contrib.admin import SimpleListFilter
    from .models import Company, Project  # 替换成你的实际模型
    
  2. 自定义筛选器类
    创建一个继承自SimpleListFilter的类,实现两个核心方法:

    class CompanyFilter(SimpleListFilter):
        # 筛选器在Admin界面显示的标题
        title = '公司'
        # 用于URL参数的标识名(可以自定义,只要不冲突)
        parameter_name = 'target_company'
    
        def lookups(self, request, model_admin):
            # 返回筛选选项:(实际筛选值, 显示给用户的文本)
            # 这里按名称排序,方便用户查找
            companies = Company.objects.all().order_by('name')
            return [(company.id, company.name) for company in companies]
    
        def queryset(self, request, queryset):
            # 根据用户选择的ID过滤项目QuerySet
            selected_company_id = self.value()
            if selected_company_id:
                return queryset.filter(company__id=selected_company_id)
            # 如果没有选择,返回全部项目
            return queryset
    
  3. 在项目Admin中应用自定义筛选器
    修改你的ProjectAdmin配置,把原来的list_filter替换成自定义的筛选器:

    @admin.register(Project)
    class ProjectAdmin(admin.ModelAdmin):
        # 替换成自定义的CompanyFilter
        list_filter = (CompanyFilter,)
        # 其他Admin配置(比如list_display等)
        # list_display = ('name', 'company', ...)
    

额外说明

  • 如果你的公司数据量很大,可以在lookups方法中优化查询,比如用values_list('id', 'name')来减少内存占用:
    def lookups(self, request, model_admin):
        return Company.objects.values_list('id', 'name').order_by('name')
    
  • 即使存在同名公司,因为每个选项对应的是不同的ID,用户可以精准选择到目标公司的项目,完全解决了同名筛选的问题。

内容的提问来源于stack exchange,提问作者Сергей Сивков

火山引擎 最新活动