Как создать выпадающий фильтр в админке 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 к фильтру.