Django管理员搜索字段复选框

Django管理员搜索字段复选框,django,django-admin,Django,Django Admin,Django Admin中是否有标准方法在搜索旁边添加复选框以选择(在运行时)要搜索的字段 我知道有AdminModel属性search\u fields=['one\u field','other\u field']等。但是对于这个项目,我需要在当时选择一个字段 任何想法欢迎!塔克斯 从文档中: 默认实现搜索ModelAdmin.search\u字段中指定的字段 此方法可能会被您自己的自定义搜索方法覆盖。例如,您可能希望按整数字段进行搜索,或者使用外部工具,如Solr或Haystack。必须确

Django Admin中是否有标准方法在搜索旁边添加复选框以选择(在运行时)要搜索的字段

我知道有AdminModel属性
search\u fields=['one\u field','other\u field']
等。但是对于这个项目,我需要在当时选择一个字段

任何想法欢迎!塔克斯

从文档中:

默认实现搜索ModelAdmin.search\u字段中指定的字段

此方法可能会被您自己的自定义搜索方法覆盖。例如,您可能希望按整数字段进行搜索,或者使用外部工具,如Solr或Haystack。必须确定搜索方法实现的queryset更改是否会在结果中引入重复项,并在返回值的第二个元素中返回True

例如,要启用按整数字段搜索,可以使用:

class PersonAdmin(admin.ModelAdmin):
    list_display = ('name', 'age')
    search_fields = ('name',)

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term)
        try:
            search_term_as_int = int(search_term)
        except ValueError:
            pass
        else:
            queryset |= self.model.objects.filter(age=search_term_as_int)
        return queryset, use_distinct


添加您需要的逻辑

Django Admin不为搜索字段提供自定义复选框,但您可以通过覆盖Django搜索来实现类似的功能。可以使用基于前缀的搜索

代码示例

class UserTimelineAdmin(admin.ModelAdmin):
    list_display = ('user_screen_name','user_name', 'created_at',)
    search_fields = ['user_screen_name','user_name']

    def get_search_results(self, request, queryset, search_term):
        new_queryset, use_distinct = super().get_search_results(request, queryset, search_term)

        if search_term.startswith('screen_name-'):
            search_term = search_term.replace('screen_name-','')
            try:
                new_queryset |= queryset.filter(user_screen_name=search_term)
            except:
                pass

        elif search_term.startswith('user_name-'):
            search_term = search_term.replace('user_name-','')
            try:
                new_queryset |= queryset.filter(user_name=search_term)
            except:
                pass


        return new_queryset, use_distinct
  • 要搜索第一个字段,即用户屏幕名称,请在搜索输入中使用前缀屏幕名称-。示例:screen_name-XYZ将搜索screen_name-XYZ的所有用户

  • 要搜索第二个字段,即用户名,请在搜索输入中使用前缀用户名-。示例:user_name-XYZ将搜索所有用户名为XYZ的用户

  • 要获得两个搜索字段的组合结果,请不要使用任何前缀

  • 屏幕截图

    以下屏幕截图显示仅使用屏幕名称字段进行搜索(使用前缀屏幕名称-

    编辑

    • 将self.model.objects.filter替换为queryset.filter
    • 添加了截图
    这样做是为了避免将列表筛选器与搜索字段筛选器一起使用时出现错误