Django管理员搜索字段复选框

时间:2015-07-22 19:08:58

标签: django django-admin

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

我知道有AdminModel属性search_fields = ['one_field', 'other_field']等。但对于这个项目,我需要在当时选择一个字段。

欢迎任何想法!感谢名单!

2 个答案:

答案 0 :(得分:1)

来自文档:

默认实现搜索ModelAdmin.search_fields中指定的字段。

您可以使用自己的自定义搜索方法覆盖此方法。例如,您可能希望按整数字段搜索,或使用Solr或Haystack等外部工具。您必须确定搜索方法实现的查询集更改是否可能在结果中引入重复项,并在返回值的第二个元素中返回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

https://docs.djangoproject.com/en/1.8/ref/contrib/admin/

添加你需要的逻辑

答案 1 :(得分:1)

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
  1. 要在第一个字段(即user_screen_name)上进行搜索,请在搜索输入中使用前缀 screen_name-。例如: screen_name-XYZ 将搜索所有具有screen_name XYZ的用户。

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

  3. 要在两个搜索字段上获得合并的结果,请不要使用任何前缀。

屏幕截图

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

Searching with screen_name field

修改

  • self.model.objects.filter替换为queryset.filter
  • 已添加屏幕截图

这样做是为了避免将列表过滤器与搜索字段过滤器一起使用时出现错误。