Schließlich möchte ich bestimmte Javascript-Datei (en) basierend auf ... was auch immer einschließen/ausschließen. Die Medienklasse selbst zu definieren, funktioniert nicht, da sie nur einmal ausgewertet wird.Wie kann ich die Eigenschaft "media" von Djangos ModelAdmin überschreiben und dynamisieren?
Ich weiß, dass ich dies tun kann, indem ich eine benutzerdefinierte Admin-Vorlage, aber ich frage mich, ob es eine einfache Möglichkeit ist, es zu tun, indem Sie einfach die Medien-Eigenschaft dynamisch.
Dies ist, was ich bisher:
from django.contrib import admin
class MyModelAdmin(admin.ModelAdmin):
model = MyModel
...
@property
def media(self):
media = super(MyModelAdmin, self).media
if whatever_condition_I_want:
# somehow add "my/js/file3.js"
return media
class Media:
css = {
"all": (
"my/css/file1.css",
"my/css/file2.css",
)
}
js = (
"my/js/file1.js",
"my/js/file2.js",
)
Und das funktioniert fast, aber ich fand, dass super(MyModelAdmin, self).media
Aufruf meiner aktuellen Klasse Definitionen Medien ignoriert. Beim Herumstöbern fand ich, dass dies daran liegt, dass die Medieneigenschaft der Elternklasse von django.forms.widgets.media_property
(über MediaDefiningClass
) umschlossen ist und da meine Medieneigenschaften überschrieben werden, wird meine Medieneigenschaft nicht umschlossen. Ich habe versucht, es manuell über:
from django.forms import media_property
MyModelAdmin.media = media_property(MyModelAdmin)
, aber media_property wird nicht importiert.
Wie kann ich meine statischen Medien und meine dynamischen Medien hinzufügen, und wie füge ich meine dynamischen Medien so hinzu, dass django zufrieden ist?