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.
Pascal July 23, 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 July 25, 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 July 25, 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 July 26, 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 July 29, 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 Aug. 11, 2008
Klingt interessant. Ich bin froh das gelesen zu haben.