Ein besseres Django Admin ManyToMany Field Widget

101

Ich finde das Standard- models.ManyToManyFieldWidget des Django-Administrators umständlich zu verwenden. Es ist das HTML-Auswahlelement , und wenn Sie viele Objekte des "anderen" Modells haben, ist es ziemlich unpraktisch, die "anderen" Objekte zu finden, die Sie mit "diesem" Objekt verknüpfen möchten. Und wenn Sie viele Objekte des "anderen" Modells haben, scheint dies das Rendern der Admin-Seite sogar zu verlangsamen.

Ich bin mir bewusst, dass ich mein eigenes benutzerdefiniertes Admin-Widget erstellen und es nach Belieben auf mein Widget anwenden kann. Gibt ManyToManyFieldses jedoch vorgefertigte Widgets , die ich stattdessen verwenden könnte? In meinen Träumen stelle ich mir ein HTML-Widget zur automatischen Vervollständigung der Texteingabe vor. Ist dies im Django Admin Framework überhaupt praktikabel / möglich?

Vielen Dank.

Chris W.
quelle

Antworten:

160

Versuchen Sie, das filter_horizontalAttribut für Ihre Admin-Klasse zu verwenden, zum Beispiel:

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

Wie in der Dokumentation erwähnt , wird beim Hinzufügen eines ManyToManyField zu dieser Liste stattdessen eine raffinierte, unauffällige JavaScript-Filteroberfläche verwendet, die die Suche innerhalb der Optionen ermöglicht. filter_verticalmacht das gleiche mit einem etwas anderen Layout.

Blair
quelle
Toll! Das klingt genau so, wie ich es suche, ich werde es versuchen.
Chris W.
Es funktioniert, aber wie man dieses Feld schreibgeschützt macht. Ich versuche read only_fields = ('users',). Aber es wird in einer durch Komma getrennten Zeile angezeigt. Ich möchte in Zeilenumbruch gezeigt werden ...
Varnan K
Ich hatte Angst, ich müsste mein eigenes Widget schreiben, aber das ist perfekt! Dank dafür! ; P
umat
7

Sie können versuchen, eine unformatierte ID im Administrator zu verwenden. und die Django-Dokumente: http://docs.djangoproject.com/de/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

Wenn Sie nach etwas mit automatischer Vervollständigung suchen, sollten Sie dies als Ausgangspunkt betrachten: http://code.djangoproject.com/wiki/AutoCompleteSolutions

und schließlich ein sehr vereinfachtes Inline-Beispiel:

models.py

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

admin.py:

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

Ich habe noch nicht damit gespielt, aber ich fand diese vielversprechend aussehende Bibliothek, auf die an anderer Stelle verwiesen wird.

Es scheint genau das zu tun, was ich wollte. Anstatt die gesamte Liste verwandter Objekte zu laden (unabhängig davon, wie viele es gibt!) Und Ihnen eine Auswahl zu präsentieren, um einige davon auszuwählen filter_horizontal, wird ein Such- / Filterfeld angezeigt und es werden Typeahead- / Autocomplete-Aufrufe verwendet, um Ergebnisse abzurufen dynamisch. Dies ist ideal für den Fall, dass Sie vielleicht 5000 Benutzer haben und 3 oder 4 davon auswählen möchten, ohne auf <option>das Herunterladen und Rendern von 5.000 Elementen zu warten .

Codierer
quelle
0

Dies ist eine alte Frage, aber ich möchte hier eine Antwort für Leute hinzufügen, die dies genauso finden wie ich: Diese Situation ist genau das, wofür Django-Inline-Administratoren sind. Insbesondere verwende ich TabularInlines mit unformatierten ID-Feldern für viele-zu-viele-Beziehungen, die zu viele Auswahlmöglichkeiten haben.

https://docs.djangoproject.com/de/2.1/ref/contrib/admin/#django.contrib.admin.TabularInline

kloddant
quelle