Django admin: Change selected box of related fields to autocomplete

The simplest out-of-the-box solution is to add the field to your ModelAdmin's raw_id_fields -- then you'll get a pop-up window in which you can use the built-in searching/filtering and pagination control's to find and select the object you're after.

If you really want autocomplete, the other answers give a you reasonable starting point.


I had this problem and my conclusion was to use an autocomplete field instead. It works pretty well in most cases. The only problem is when you have a lot of entries that are mostly the same. For example, in your case, if you type Robert for the name and there's a few hundred Robert entries in the list...

UPDATE

As mentions in shuckc's answer, Django 2.0+ admin as now autocomplete built in.

For older Django or to use outside of the admin (old answer)

There are many apps that add autocomplete to the Django admin:

  • django-autocomplete-light
  • django-extensions (ForeignKeyAutocompleteAdmin)
  • django-autocomplete (on google code)
  • django-ajax-selects
  • django-admin-autocomplete
  • django-autocomplete (tyrion)

My preferred one is the last one. It's well written, it can be used with the admin and outside of the admin, it works with ManyToManyFields, ForeignKeyFields, CharFields, etc.

I did a fork of this project for my client that adds some niceties like a lookup (loupe) button like the ForeignKeyRawIdWidget.


You can use the ForeignKeyRawIdWidget from django.contrib.admin.widgets. It renders FK relations as an input with a small button along-side which presents a searchable pop up.


Django 2.0 admin has autocomplete built in, just set the autocomplete_fields field on the ModelAdmin class. e.g.

class QuestionAdmin(admin.ModelAdmin):
    ordering = ['date_created']
    search_fields = ['question_text']

class ChoiceAdmin(admin.ModelAdmin):
    autocomplete_fields = ['question']