Как создать выпадающий фильтр в админке Django с помощью select2?

Я работаю над настройкой админки Django, где мне нужно создать выпадающие фильтры с select2. Я использую пакет django-admin-autocomplete-filter, который отлично работает для внешних ключей, но, похоже, обычные поля не поддерживаются. Например, в моей модели Collection есть целочисленное поле (месяцы). Я добавил list_filter = [AutocompleteFactory(‘Months’, ‘months’] внутри CollectionAdmin и получил следующую ошибку: Объект DeferredAttribute теперь имеет атрибут 'get_queryset'

Пакет django-admin-autocomplete-filter в первую очередь поддерживает поля с внешним ключом и многие-ко-многим, поэтому его использование с обычным полем, например IntegerField, приводит к ошибке DeferredAttribute. Чтобы создать выпадающий фильтр для обычного поля (например, months в вашей модели Collection), вы можете использовать пользовательский SimpleListFilter для достижения аналогичной функциональности. Вот как это реализовать:

  1. Создайте пользовательский фильтр для months:

    from django.contrib import admin
    
    class MonthsFilter(admin.SimpleListFilter):
        title = 'Months'
        parameter_name = 'months'
    
        def lookups(self, request, model_admin):
            # Returns a list of tuples representing the filter options
            months = model_admin.model.objects.values_list('months', flat=True).distinct()
            return [(month, str(month)) for month in months]
    
        def queryset(self, request, queryset):
            # Filters the queryset based on the selected month
            if self.value():
                return queryset.filter(months=self.value())
            return queryset
    
  2. Добавьте пользовательский фильтр в CollectionAdmin:

    @admin.register(Collection)
    class CollectionAdmin(admin.ModelAdmin):
        list_filter = [MonthsFilter]
    
  3. Добавление Select2 для выпадающего фильтра (необязательно):

    Если вы хотите применить стиль Select2 к этому фильтру, вы можете добавить немного JavaScript в админку Django, чтобы инициализировать Select2 для выпадающего фильтра:

    # In your custom admin JavaScript file
    (function($) {
        $(document).ready(function() {
            $('select[name="months"]').select2();
        });
    })(django.jQuery);
    

    Включите этот JavaScript файл в вашу админку, используя Media внутри CollectionAdmin.

Такой подход должен позволить вам иметь выпадающий фильтр для months без ошибки DeferredAttribute, добавив при этом стилистику Select2 к фильтру.

Вернуться на верх