Как настроить фильтрацию в Django-admin?

Фильтрация в Django-admin позволяет сузить набор отображаемых в административной панели объектов на основе заданных критериев. Django-admin предоставляет несколько способов настройки фильтрации:

1. Фильтрация по полям модели:
- В классе модели определите нужные поля, которые будут использоваться для фильтрации. Например, если у вас есть модель "Product" с полем "name", вы можете добавить следующую строку в соответствующий класс администрирования:

  list_filter = ('name',)

Это создаст фильтр по полю "name" в административной панели.

2. Фильтрация ManyToMany-полей:
- Если у вас есть ManyToMany-поле в модели, вы можете использовать его для фильтрации объектов. Например, если у вас есть модель "Category" с полем "products" типа ManyToMany на модель "Product", вы можете добавить следующую строку в класс администрирования:

  list_filter = ('category',)

Это создаст фильтр по полю "category" в административной панели.

3. Пользовательские фильтры:
- Вы можете создать собственные фильтры, чтобы выполнять более сложную фильтрацию. Для этого вам нужно создать класс, унаследованный от admin.SimpleListFilter, и затем добавить его в список list_filter. Например, если вы хотите создать фильтр по диапазону даты создания объектов модели "Product", вы можете сделать следующее:

  class CreationDateFilter(admin.SimpleListFilter):
      title = 'Дата создания'
      parameter_name = 'creation_date'

      def lookups(self, request, model_admin):
          return (
              ('week', 'В эту неделю'),
              ('month', 'В этом месяце'),
              ('year', 'В этом году'),
          )

      def queryset(self, request, queryset):
          if self.value() == 'week':
              return queryset.filter(created__gte=datetime.now() - timedelta(days=7))
          elif self.value() == 'month':
              return queryset.filter(created__gte=datetime.now() - timedelta(days=30))
          elif self.value() == 'year':
              return queryset.filter(created__gte=datetime.now() - timedelta(days=365))

  class ProductAdmin(admin.ModelAdmin):
      list_filter = (CreationDateFilter,)

  admin.site.register(Product, ProductAdmin)

Теперь в административной панели будет доступен пользовательский фильтр "Дата создания", который позволит вам фильтровать объекты "Product" по дате создания.

Все эти способы могут быть использованы комбинированно для достижения более сложной фильтрации в Django-admin.