Я считаю, что виджет Django Admin по умолчанию models.ManyToManyField
является громоздким для использования. Это элемент HTML select, и если у вас много объектов "другой" модели, то совершенно нецелесообразно фактически находить "другие" объекты вы хотите связать с "this" Object. И если у вас есть много объектов "другой" модели, это даже замедляет рендеринг страницы администратора.
Мне известно, что я могу создать собственный пользовательский виджет администратора и применить его к моему ManyToManyFields
по своему усмотрению, но есть ли какие-либо готовые из них, которые я мог бы использовать вместо этого? В моих мечтах я представляю встроенный HTML-виджет с автоматическим заполнением текста. Это даже практично/возможно сделать в рамках администрирования Django?
Спасибо.
Попробуйте использовать атрибут filter_horizontal
в вашем классе администратора, например:
class SomeModelAdmin(admin.ModelAdmin):
filter_horizontal = ('users',)
Как упоминалось в документации, "добавление ManyToManyField в этот список вместо этого использует отличный ненавязчивый интерфейс JavaScript" фильтр ", который позволяет выполнять поиск в пределах параметров". filter_vertical
делает то же самое с немного другой компоновкой.
вы можете попробовать использовать сырой идентификатор в admin. и django docs: 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",)
Я на самом деле не играл с ним, но я нашел эту перспективную библиотеку, которая упоминается в другом месте.
Кажется, он делает то, что я хотел. Вместо того, чтобы загружать весь список связанных объектов (независимо от их количества!) И предлагая вам выборщик, чтобы выбрать несколько из них, как это делает filter_horizontal
, он представляет окно поиска/фильтра и использует вызовы typeahead/autocomplete для получения результатов динамически. Это отлично подходит для случая, когда у вас может быть 5000 пользователей и вы хотите выбрать 3 или 4 из них, не дожидаясь элементов 5k <option>
для загрузки и рендеринга.