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:

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.py und 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.


Comments closed

Sorry, new comments are no longer allowed for this entry.

Write me an email if you have feedback or any questions regarding this post. If you found this post useful and just want to say thank you then don't forget that I have an Amazon Wishlist. :-)


↑ to the elevators

© 2001—2010 Martin Mahner. This is an I ♥ Django Project.

Admin | Generated: Sun, 7 Mar 2010 13:18:27 +0100