Есть ли способ поиска нескольких терминов в поиске администратора? Джанго
В панели поиска администратора 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
, с другой стороны, гарантирует, что любые выбранные фильтры также будут применены.