Django admin: изменение выбранного поля связанных полей для автозаполнения

У нас есть некоторые модели, которые имеют пользователя как внешний ключ. Но около 25000 пользователей в нашей системе немного сложны, чтобы найти тот, который нам нужен.

Есть ли решение, которое лучше, чем поле выбора? Может быть, автозаполнение, чтобы мы могли начать вводить имя пользователя/адрес? Или просто окно поиска? При переключении соответствующего пользователя для этих объектов становится все труднее и труднее с 25000 несортированными пользователями.

Даже просто настроить его для сортировки пользователей по имени пользователя будет полезно.

Ответы

Ответ 1

У меня была эта проблема, и я решил использовать вместо этого поле автозаполнения. Это работает довольно хорошо в большинстве случаев. Единственная проблема, когда у вас много записей, которые в основном одинаковы. Например, в вашем случае, если вы введете имя Роберта и в списке будет несколько сотен записей Роберта...

UPDATE

Как упоминается в ответе shuckc, Django 2. 0+ админ, как теперь автозаполнение встроено в.

Для старшего Django или для использования вне администратора (старый ответ)

Существует множество приложений, которые добавляют автозаполнение администратору Django:

Мой любимый - последний. Он хорошо написан, его можно использовать как с администратором, так и вне его, он работает с ManyToManyFields, ForeignKeyFields, CharFields и т.д.

Я сделал форк этого проекта для моего клиента, который добавляет некоторые тонкости, такие как кнопка поиска (лупа), например ForeignKeyRawIdWidget.

Ответ 2

Администратор Django 2.0 имеет встроенную функцию автозаполнения, просто установите поле autocomplete_fields в классе ModelAdmin. например

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

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

Ответ 3

Самое простое из готовых решений состоит в том, чтобы добавить поле в ваш ModelAdmin raw_id_fields - Появится всплывающее окно, в котором вы можете использовать встроенный элемент поиска/фильтрации и разбиения на страницы, чтобы найти и выбрать объект, который вам нужен.

Если вы действительно хотите автозаполнение, другие ответы дают вам разумную отправную точку.

Ответ 4

Вы можете использовать ForeignKeyRawIdWidget от django.contrib.admin.widgets. Он отображает отношения FK как вход с небольшой кнопкой вдоль стороны, которая представляет собой всплывающее окно с возможностью поиска.

Ответ 6

Нашел очень подходящее встроенное решение для этого: используйте filter_horizontal в вашем Admin config:

Скажите, что у вас есть School и Student Model, а школа имеет отношение ManyToManyField к длинному списку студентов.

# model.py
class School(models.Model):
    ...
    students = models.ManyToManyField(Student)

Просто добавьте это в свой SchoolAdmin:

# admin.py
filter_horizontal = ('student',)

Вы получите такую ​​договоренность! введите описание изображения здесь