Как создать выпадающий фильтр в админке 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 для достижения аналогичной функциональности. Вот как это реализовать:
Создайте пользовательский фильтр для
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Добавьте пользовательский фильтр в
CollectionAdmin:@admin.register(Collection) class CollectionAdmin(admin.ModelAdmin): list_filter = [MonthsFilter]Добавление 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 к фильтру.