2014-04-25 13 views
5

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?

Antwort

11

Kurz nach dem Schreiben der oben genannten Frage, fand ich eine Technik, die funktioniert. Anstatt eine Media Klasse zu definieren, füge ich einfach ALLE meiner css/js über die media Methode hinzu:

from django.contrib import admin 
class MyModelAdmin(admin.ModelAdmin): 
    model = MyModel 
    ... 

    @property 
    def media(self): 
     media = super(MyModelAdmin, self).media 
     css = { 
      "all": (
       "my/css/file1.css", 
       "my/css/file2.css", 
      ) 
     } 
     js = [ 
      "my/js/file1.js", 
      "my/js/file2.js", 
     ] 
     if whatever_condition_I_want: 
      js.append("my/js/file3.js") 
     media.add_css(css) 
     media.add_js(js) 
     return media