2011-03-22 27 views
84

Encuentro que el widget models.ManyToManyField predeterminado de Django Admin es engorroso de usar. Es el elemento HTML select y si tiene muchos Objetos del "otro" modelo, entonces no es práctico encontrar los "otros" Objetos que desea asociar con "este" Objeto. Y si tiene mucho de objetos del "otro" modelo, parece que incluso ralentiza la presentación de la página de administración.A Better Django Admin ManyToMany Widget de campo

Soy consciente de que puedo construir mi propio widget de administrador personalizado y aplicarlo a mi ManyToManyFields como mejor me parezca, pero ¿hay alguno precompilado que pueda usar en su lugar? En mis sueños, me imagino un widget HTML de entrada de texto autocompletado. ¿Esto es incluso práctico/posible de hacer en el marco de administración de Django?

Gracias.

Respuesta

135

intente utilizar el atributo filter_horizontal en su clase de administración, por ejemplo:

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

Como se mencionó en the documentation ", añadiendo un ManyToManyField a esta lista en su lugar utilizará un ingenioso Javascript no intrusivo 'interfaz de filtro' que permite la búsqueda dentro de las opciones ". filter_vertical hace lo mismo con un diseño ligeramente diferente.

+0

¡Genial! Esto suena exactamente a lo que estoy buscando, lo intentaré. –

+2

excelente, hace que manytomany sea mucho más claro de usar – maazza

+0

Su funcionamiento Pero cómo hacer que este archivo sea de solo lectura. Estoy intentar leer only_fields = ('usuarios',). Pero se muestra en una línea separada por comas. Quiero que se muestre en el salto de línea ... –

6

puede intentar usar una identificación sin formato en el administrador. y el django docs: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

si usted está buscando algo con la función de 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:

models.py

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

admin.py:

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

No he jugado realmente con él, pero encontré this promising looking library mencionado en otra parte.

Parece que hace exactamente lo que yo quería. En lugar de cargar toda la lista de objetos relacionados (¡independientemente de cuántos!) Y presentarle un seleccionador para seleccionar algunos de ellos, como filter_horizontal, presenta un cuadro de búsqueda/filtro y usa las llamadas typeahead/autocomplete para recuperar resultados dinámicamente Esto es ideal para el caso en el que tenga tal vez 5000 usuarios y desee elegir 3 o 4 de ellos sin esperar a que se descarguen 5K <option> elementos.

Cuestiones relacionadas