Newforms AdminOptions besser strukturieren
Wer in den letzten Tagen seine schon etwas ältere Django-trunk Version aktualisiert hat, dürfte sein blaues Wunder erlebt haben, positiv oder negativ. Unter anderem hat Newforms Admin ja endlich Einzug gehalten.
Anders als bisher werden Einstellungen der Models nun nicht mehr in einer Subklasse Admin des Models definiert, sondern in einer eigenen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Entry(models.Model): title = models.CharField(max_length=255) slug = models.SlugField(blank=True, db_index=True) content = models.TextField() published = models.DateTimeField(auto_now_add=True) class EntryAdmin(admin.ModelAdmin): save_on_top = True list_select_related = True date_hierarchy = 'published' list_display_links = ('title') search_fields = ('title', 'content') admin.site.register(Entry, EntryAdmin) |
Nun gibt es prinzipiell zwei Möglichkeiten, diese Admin-Optionen an die Models zu "binden":
-
autodiscover() durchsucht die Apps nach einer Datei "admin.py" und importiert dieses Modul automatisch.
-
Per Hand und überall mittels "admin.site.register('model', 'options')" wie im obigen Beispiel.
Ich bevorzuge den zweiten Weg, da ist weniger Voodoo im Spiel und ich kann penibel festlegen, welches App im Admin erscheint und welche Optionen ihm zugewiesen werden.
Bei meinem aktuellen Projekt habe ich dafür eine Basisklasse "DefaultModelAdmin" für alle ModelAdmins erstellt und leite davon alle anderen ModelAdmin-Klassen ab:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # File: apps/adminprefs/defaults from django.contrib import admin class DefaultModelAdmin(admin.ModelAdmin): save_on_top = True list_select_related = True # File: models.py/admin.py from django.contrib import admin from adminprefs.defaults import DefaultModelAdmin class EntryAdmin(DefaultModelAdmin): date_hierarchy = 'published' list_display_links = ('title') search_fields = ('title', 'content') admin.site.register(Entry, EntryAdmin) |
Das ist nicht nur DRY sondern wird in Zukunft auch helfen, wenn einmal ein zentraler Eingriff für alle Admin-Sachen nötig ist.
Geschrieben am: 23. Juli 2008 um 11:24 Uhr, Abgelegt in Django & Python
Kommentare zu diesem Artikel (6):
-
Pascal schrieb am 23. Juli 2008:
Sehr coole Idee eine Default-Admin-Class zu machen! Ich bin kurz davor meine Apps auf Newforms-Admin umzustellen und denke, ich werde das auch so machen.
-
Julian schrieb am 25. Juli 2008:
Definierst du die Admin-Klassen jetzt immer noch im Model? Das haben sie doch extra decoupled, um das Model sauber zu halten. Und autodiscover und "Per Hand" sind kein entweder oder. Man kann nämlich in der admin.py "Per Hand" registrieren und autodiscover dient lediglich dazu diese admin.py zu finden und zu aufzurufen.
-
Martin schrieb am 25. Juli 2008:
@julian: Ja, ich bin so frech und definiere die Admin-Klassen derzeit noch im Model. Schande über mich!
Von "entweder oder" steht da nichts, aber ich habe die Beschreibung nun nochmal verdeutlicht.
-
Stefan schrieb am 26. Juli 2008:
Ich habe gestern in 4-5 Stunden meine Website komplett umgestellt. Meine Definitionen habe ich in die admin.py ausgelagert. Dadurch kann man die einzelnen Dateien gleich viel besser überblicken – besonders bei vielen Models.
-
Martin Geber schrieb am 29. Juli 2008:
Die Idee mit dem Default AdminModel ist genial. Ich bin heil froh, dass ich das lese bevor ich alles umstelle.
Zu dem
admin.pyund so weiter will ich mich nicht äußern, da ich mich noch nicht mit beschäftigt habe. Das ganze zu trennen kommt mir aber ganz nett vor.Danke Martin für den guten Beitrag.
-
Dennis schrieb am 11. August 2008:
Klingt interessant. Ich bin froh das gelesen zu haben.
Kommentar schreiben