In Django 2.0, autocomplete_fields was added, which is great.
Without autocomplete_fields, I can change the queryset of a ForeignKeyField using formfield_for_foreignkey.
But combining the two together doesn't work - it looks like the list of options for autocomplete is dynamic and coming from a different url, instead of from the current form.
So the question is -
How can I change the queryset in the autocomplete widget?
If you are using autocomplete_fields
for a ManyToManyField
on 'self', this example will exclude the current object.
Get the current object's id by overriding get_form
:
field_for_autocomplete = None def get_form(self, request, obj=None, **kwargs): if obj: self.field_for_autocomplete = obj.pk return super(MyAdmin, self).get_form(request, obj, **kwargs)
Next, override get_search_results
. Modify the queryset only for your model's autocomplete URI:
def get_search_results(self, request, queryset, search_term): queryset, use_distinct = super().get_search_results(request, queryset, search_term) # Exclude only for autocomplete if request.path == '/admin/myapp/mymodel/autocomplete/': queryset = queryset.exclude(field=self.field_for_autocomplete) return queryset, use_distinct
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With