Newforms AdminOptions besser strukturieren
Geschrieben 4 Wochen zuvor
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:
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:
# 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.








13:41 Uhr
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.
12:25 Uhr
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.
12:39 Uhr
@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.
08:53 Uhr
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.
10:34 Uhr
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.
20:36 Uhr
Klingt interessant. Ich bin froh das gelesen zu haben.