Есть ли способ поиска нескольких терминов в поиске администратора? Джанго

В панели поиска администратора django, если бы у меня была модель с колонкой = fruit_name, и я хотел найти в этом столбце все экземпляры либо с fruit_name = banana, либо с яблоком, в котором были бы показаны все бананы и яблоки, как я мог это сделать?

3 ответа

Решение

Переопределите метод ModelAdmin.get_search_results`:

from operator import or_
from django.db.models import Q

class MyAdmin(admin.ModelAdmin):
    ...
    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super(MyAdmin, self).get_search_results(
                                               request, queryset, search_term)
        search_words = search_term.split()
        if search_words:
            q_objects = [Q(**{field + '__icontains': word})
                                for field in self.search_fields
                                for word in search_words]
            queryset |= self.model.objects.filter(reduce(or_, q_objects))
    return queryset, use_distinct

В вашем файле admin.py вы можете настроить представление моделей.

class YourModelAdmin(admin.ModelAdmin):
       list_display = ('id_proveedor','anio','mes','fecha','fecha_mod','contacto','usuario','obs')
       list_display_links = ('id_proveedor','anio','mes','fecha','fecha_mod','contacto','usuario','obs')
       list_filter = ('id_proveedor','anio','mes')
       ordering = ['id_proveedor']
       search_fields = ('id_proveedor','anio','mes','contacot')
       list_per_page = 10

admin.site.register(YourModel, YourModelAdmin)

Вы можете настроить, какие поля вы хотите найти, поля, которые вы хотите отобразить, порядок и т. Д.

проверьте документацию о странице администратора

В моем случае использование ответа @catavaran нарушит фильтры, как указано здесь . Я придумал следующий обходной путь:

      from operator import or_
from django.db.models import Q

class MyAdmin(admin.ModelAdmin):
    ...
    def get_search_results(self, request, queryset, search_term):
        orig_queryset = queryset
        queryset, use_distinct = super(MyAdmin, self).get_search_results(
                                               request, queryset, search_term)
        search_words = search_term.split()
        if search_words:
            q_objects = [Q(**{field + '__icontains': word})
                                for field in self.search_fields
                                for word in search_words]
            queryset |= self.model.objects.filter(reduce(or_, q_objects))

    queryset = queryset & orig_queryset

    return queryset, use_distinct

Это гарантирует, что предыдущая фильтрация ant не отменяется, когда мы используем queryset |= self.model.objects.filter(reduce(or_, q_objects)). Использование orig_queryset, с другой стороны, гарантирует, что любые выбранные фильтры также будут применены.

Другие вопросы по тегам