Улучшенный виджет поля ManyToMany для администратора Django

102

Я считаю, что models.ManyToManyFieldвиджет администратора Django по умолчанию является громоздким в использовании. Это элемент выбора HTML, и если у вас много Объектов «другой» модели, то на самом деле найти «другие» объекты, которые вы хотите связать с «этим» объектом, непрактично. А если у вас много объектов «другой» модели, это, кажется, даже замедляет отрисовку страницы администратора.

Я знаю, что могу создать свой собственный виджет администратора и применить его к себе по своему ManyToManyFieldsусмотрению, но есть ли какие-нибудь заранее созданные, которые я мог бы использовать вместо этого? Во сне я представляю себе HTML-виджет с автозаполнением для ввода текста. Практично / возможно ли это сделать в админке Django?

Спасибо.

Крис В.
источник

Ответы:

161

Попробуйте использовать filter_horizontalатрибут в своем классе администратора, например:

class SomeModelAdmin(admin.ModelAdmin):
    filter_horizontal = ('users',)

Как упоминалось в документации , «добавление ManyToManyField в этот список вместо этого будет использовать изящный ненавязчивый интерфейс« фильтра »JavaScript, который позволяет выполнять поиск в пределах параметров». filter_verticalделает то же самое с немного другим макетом.

Блэр
источник
Большой! Это похоже на то, что я ищу, я попробую.
Крис В.
Его работа Но как сделать это поле только для чтения. Я пытаюсь читать only_fields = ('users',). Но это показано в одной строке, разделенной запятой. Я хочу показать в
переносе
Я волновался, что мне придется написать собственный виджет, но это идеально! Спасибо за это! ; P
umat
7

вы можете попробовать использовать необработанный идентификатор в админке. и документы django: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

если вы ищете что-то с автозаполнением, вы можете посмотреть на это как на отправную точку http://code.djangoproject.com/wiki/AutoCompleteSolutions

и, наконец, очень упрощенный встроенный пример:

models.py

class SomeModel(models.Model):
    users = models.ManyToMany(User)

admin.py:

class SomeModelAdmin(admin.ModelAdmin):
    raw_id_fields = ("users",)
mrfunyon
источник
3

Я на самом деле не играл с ней, но нашел эту многообещающую библиотеку, на которую есть ссылки в другом месте.

Кажется, он делает именно то, что я хотел. Вместо того, чтобы загружать весь список связанных объектов (независимо от того, сколько их!) И предоставлять вам средство выбора для выбора нескольких из них, как это filter_horizontalпроисходит, он представляет окно поиска / фильтрации и использует вызовы с опережением ввода / автозаполнением для получения результатов динамически. Это отлично подходит для случая, когда у вас может быть 5000 пользователей и вы хотите выбрать 3 или 4 из них, не дожидаясь <option>загрузки и рендеринга 5k элементов.

Coderer
источник
0

Это старый вопрос, но я хочу добавить здесь ответ для людей, которые находят его так же, как и я: это как раз то, для чего нужны встроенные администраторы Django. В частности, я использую TabularInlines с полями необработанных идентификаторов для отношений «многие ко многим», у которых слишком много вариантов.

https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.TabularInline

клоддант
источник