Лучший Django Admin Виджет Поля ManyToMany - PullRequest
91 голосов
/ 22 марта 2011

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

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

Спасибо.

Ответы [ 4 ]

148 голосов
/ 22 марта 2011

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

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

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

7 голосов
/ 22 марта 2011

вы можете попробовать использовать необработанный идентификатор в админке.и документы 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",)
3 голосов
/ 23 августа 2016

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

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

0 голосов
/ 07 августа 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...