diff --git a/djaa_list_filter/admin.py b/djaa_list_filter/admin.py index 4201ebe..a91f845 100644 --- a/djaa_list_filter/admin.py +++ b/djaa_list_filter/admin.py @@ -28,7 +28,6 @@ class AjaxAutocompleteSelectWidget(AutocompleteSelect): self.model = kwargs.pop('model') self.field_name = kwargs.pop('field_name') kwargs.update(admin_site=self.model_admin.admin_site) - kwargs.update(field=getattr(self.model, self.field_name).field) super().__init__(*args, **kwargs) def render(self, name, value, attrs=None, renderer=None): @@ -46,16 +45,16 @@ class AjaxAutocompleteSelectWidget(AutocompleteSelect): class AjaxAutocompleteListFilter(admin.RelatedFieldListFilter): title = _('list filter') - parameter_name = '%s_%s__exact' + parameter_name = None template = 'djaa_list_filter/admin/filter/autocomplete_list_filter.html' def __init__(self, field, request, params, model, model_admin, field_path): + model = field.remote_field.model super().__init__(field, request, params, model, model_admin, field_path) - - qs_target_value = self.parameter_name % (field.name, model._meta.pk.name) - queryset = self.get_queryset_for_field(model, field.name) + qs_target_value = f'{field_path}__{model._meta.pk.name}__exact' + queryset = model.objects.get_queryset() widget = AjaxAutocompleteSelectWidget( - model_admin=model_admin, model=model, field_name=field.name, qs_target_value=qs_target_value + model_admin=model_admin, model=model, field=field, field_name=field.name, qs_target_value=qs_target_value ) class AutocompleteForm(forms.Form): @@ -68,33 +67,16 @@ class AjaxAutocompleteListFilter(admin.RelatedFieldListFilter): initial_values.update(autocomplete_field=autocomplete_field_initial_value) self.autocomplete_form = AutocompleteForm(initial=initial_values, prefix=field.name) - def get_queryset_for_field(self, model, name): - """ - Thanks to farhan0581 - https://github.com/farhan0581/django-admin-autocomplete-filter/blob/master/admin_auto_filters/filters.py - """ - - field_desc = getattr(model, name) - if isinstance(field_desc, ManyToManyDescriptor): - related_model = field_desc.rel.related_model if field_desc.reverse else field_desc.rel.model - elif isinstance(field_desc, ReverseManyToOneDescriptor): - related_model = field_desc.rel.related_model - else: - return field_desc.get_queryset() - return related_model.objects.get_queryset() - class AjaxAutocompleteListFilterModelAdmin(admin.ModelAdmin): - def get_list_filter(self, request): - list_filter = list(super().get_list_filter(request)) - autocomplete_list_filter = self.get_autocomplete_list_filter() + def __init__(self, *args, **kwargs): + autocomplete_list_filter = list(getattr(self,'autocomplete_list_filter',[])) + list_filter = list(getattr(self,'list_filter',[])) if autocomplete_list_filter: for field in autocomplete_list_filter: list_filter.append((field, AjaxAutocompleteListFilter)) - return list_filter - - def get_autocomplete_list_filter(self): - return list(getattr(self, 'autocomplete_list_filter', [])) + self.list_filter = list_filter + super().__init__(*args, **kwargs) class Media: js = [