2011-03-22 2 views
84

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

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

Спасибо.

ответ

135

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

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

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

+0

Отлично! Это похоже на то, что я ищу, я попробую. –

+2

отлично, он делает manytomany намного более ясным для использования – maazza

+0

Его работа Но как сделать это поданным только для чтения. Я пытаюсь read only_fields = ('users',). Но его показано в одной строке, разделенной запятой. Я хочу показать в строке разрыва ... –

6

вы можете попробовать использовать сырой идентификатор администратора. и Джанго документы: 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

Я на самом деле не играл с ним, но нашел this promising looking library в другом месте.

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

Смежные вопросы