Un miglior widget per il campo ManyToMany di Django Admin


101

Trovo che il models.ManyToManyFieldwidget predefinito dell'amministratore di Django sia scomodo da usare. È l' elemento di selezione HTML e se si dispone di molti oggetti del modello "altro", è piuttosto poco pratico trovare gli "altri" oggetti che si desidera associare a "questo" oggetto. E se hai molti oggetti dell '"altro" modello sembra rallentare anche il rendering della pagina Admin.

Sono consapevole di poter creare il mio widget di amministrazione personalizzato e applicarlo al mio ManyToManyFieldscome ritengo opportuno, ma ce ne sono di preconfigurati che potrei usare invece? Nei miei sogni, immagino un widget HTML per l'inserimento del testo a completamento automatico. Questo è anche pratico / possibile da fare nel framework di amministrazione di Django?

Grazie.

Risposte:


160

Prova a utilizzare l' filter_horizontalattributo nella tua classe amministratore, ad esempio:

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

Come accennato nella documentazione , "l'aggiunta di un ManyToManyField a questo elenco utilizzerà invece un'interfaccia di" filtro "JavaScript elegante e discreta che consente la ricerca all'interno delle opzioni". filter_verticalfa la stessa cosa con un layout leggermente diverso.


Grande! Sembra esattamente quello che sto cercando, ci proverò.
Chris W.

Funziona, ma come rendere questo file di sola lettura. Sto provando a leggere only_fields = ('users',). Ma è mostrato in una sola riga separata da virgola. Voglio mostrare in interruzione di riga ...
Varnan K

Ero preoccupato di dover scrivere il mio widget, ma è perfetto! Grazie per quello! ; P
umat

7

potresti provare a utilizzare un ID grezzo nell'amministratore. e la documentazione di django: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

se stai cercando qualcosa con il completamento automatico potresti considerare questo come un punto di partenza http://code.djangoproject.com/wiki/AutoCompleteSolutions

e infine un esempio in linea molto semplicistico:

models.py

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

admin.py:

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

3

In realtà non ci ho giocato, ma ho trovato questa libreria dall'aspetto promettente referenziato altrove.

Sembra fare esattamente quello che volevo. Piuttosto che caricare l'intero elenco di oggetti correlati (indipendentemente da quanti ce ne sono!) E presentarti con un selettore per selezionarne alcuni filter_horizontal, presenta una casella di ricerca / filtro e utilizza le chiamate di testata / completamento automatico per recuperare i risultati dinamicamente. Questo è ottimo per il caso in cui si hanno forse 5000 utenti e si desidera sceglierne 3 o 4 senza attendere il <option>download e il rendering di 5k elementi.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.