How to clear selection in Django autocomplete field

Viewed 282

There is a simple page in django-admin:

class Some(admin.ModelAdmin):
  ...
  autocomplete_fields = ['user', ...]

The problem is when user is selected I cannot clear selection in admin interface.

Is there some setting for autocomplete field to clear selection?

1 Answers

I found out that autocomplete for foreignkey fields uses AutocompleteSelect, and it's coded to not show the clear option when the model is required:

from AutocompleteMixin in django.contrib.admin.widgets:

def build_attrs(self, base_attrs, extra_attrs=None):
"""
Set select2's AJAX attributes.

Attributes can be set using the html5 data attribute.
Nested attributes require a double dash as per
https://select2.org/configuration/data-attributes#nested-subkey-options
"""
attrs = super().build_attrs(base_attrs, extra_attrs=extra_attrs)
attrs.setdefault('class', '')
attrs.update({
    'data-ajax--cache': 'true',
    'data-ajax--type': 'GET',
    'data-ajax--url': self.get_url(),
    'data-theme': 'admin-autocomplete',
    'data-allow-clear': json.dumps(not self.is_required),
    'data-placeholder': '',  # Allows clearing of the input.
    'class': attrs['class'] + (' ' if attrs['class'] else '') + 'admin-autocomplete',
})
return attrs

To solve this to work as expected inside Inlines I just hardcoded the 'data-allow-clear' attribute:

class MyAutocompleteSelect(AutocompleteSelect):
def build_attrs(self, base_attrs, extra_attrs=None):
    attrs = super().build_attrs(base_attrs, extra_attrs=extra_attrs)
    attrs.update({'data-allow-clear':'true'})
    return attrs

To finish, my Inline class:

class MyInLine(admin.TabularInline):
autocomplete_fields = ('my_autocomplete_field',)

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'my_autocomplete_field':
        db = kwargs.get('using')
        kwargs['widget'] = MyAutocompleteSelect(db_field.remote_field, self.admin_site, using=db)
    return super().formfield_for_foreignkey(db_field, request, **kwargs)

Hope it helps you to solve your problem!

Related