Un mejor widget de campo ManyToMany para el administrador de Django

101

Encuentro que el models.ManyToManyFieldwidget predeterminado de Django Admin es complicado de usar. Es el elemento de selección HTML y si tiene muchos Objetos del modelo "otro", entonces no es práctico encontrar los "otros" Objetos que desea asociar con "este" Objeto. Y si tiene muchos objetos del modelo "otro", parece que incluso ralentiza la representación de la página de administración.

Soy consciente de que puedo crear mi propio widget de administración personalizado y aplicarlo a mi ManyToManyFieldscomo mejor me parezca, pero ¿hay alguno preconstruido que pueda usar en su lugar? En mis sueños, imagino un widget HTML de entrada de texto que se completa automáticamente. ¿Es esto incluso práctico / posible de hacer en el marco de administración de Django?

Gracias.

Chris W.
fuente

Respuestas:

160

Intente usar el filter_horizontalatributo en su clase de administrador, por ejemplo:

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

Como se menciona en la documentación , "agregar un ManyToManyField a esta lista utilizará en su lugar una interfaz de" filtro "de JavaScript ingeniosa y discreta que permite buscar dentro de las opciones". filter_verticalhace lo mismo con un diseño ligeramente diferente.

Blair
fuente
¡Excelente! Esto suena exactamente como lo que estoy buscando, lo intentaré.
Chris W.
Está funcionando Pero cómo hacer que este archivo sea de solo lectura. Intento leer only_fields = ('usuarios',). Pero se muestra en una sola línea separada por comas. Quiero que se muestre en el salto de línea ...
Varnan K
Me preocupaba tener que escribir mi propio widget, ¡pero esto es perfecto! ¡Gracias por eso! ; P
umat
7

podría intentar usar una identificación sin formato en el administrador. y los documentos de django: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

si está buscando algo con autocompletar, es posible que desee ver esto como un punto de partida http://code.djangoproject.com/wiki/AutoCompleteSolutions

y finalmente un ejemplo en línea muy simplista:

modelos.py

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

admin.py:

class SomeModelAdmin(admin.ModelAdmin):
    raw_id_fields = ("users",)
mrfunyon
fuente
3

En realidad, no he jugado con él, pero encontré esta biblioteca de aspecto prometedor referenciada en otro lugar.

Parece hacer exactamente lo que quería. En lugar de cargar la lista completa de objetos relacionados (¡sin importar cuántos hay!) Y presentarle un selector para seleccionar algunos de ellos, al igual que lo filter_horizontalhace, presenta un cuadro de búsqueda / filtro y utiliza llamadas de escritura anticipada / autocompletar para recuperar resultados. dinamicamente. Esto es ideal para el caso en el que tiene tal vez 5000 usuarios y desea elegir 3 o 4 de ellos sin esperar <option>a que se descarguen y procesen 5k elementos.

Coderer
fuente