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.

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.


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",)

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 .


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.