2014-04-25 6 views
5

Ostatecznie, chciałbym włączyć/wyłączyć niektóre pliki javascript na podstawie ... cokolwiek. Samo zdefiniowanie klasy Media nie będzie działać, ponieważ jest oceniane tylko raz.Jak mogę przesłonić właściwość "media" Django ModelAdmin i uczynić ją dynamiczną?

Wiem, że mogę to zrobić, tworząc niestandardowy szablon administratora, ale zastanawiam się, czy istnieje prosty sposób na zrobienie tego po prostu dzięki dynamicznej właściwości mediów.

To, co mam tak daleko:

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", 
     ) 

I że prawie działa, ale okazało się, że dzwoni super(MyModelAdmin, self).media ignoruje definicje nośników moja obecna klasa jest. Przeglądając, stwierdziłem, że dzieje się tak dlatego, że właściwość multimedialna klasy nadrzędnej jest opakowana przez django.forms.widgets.media_property (przez MediaDefiningClass), a ponieważ nadpisuję media, moja właściwość multimedialna nie jest pakowana. Próbowałem ręcznie owijać go przez:

from django.forms import media_property 
MyModelAdmin.media = media_property(MyModelAdmin) 

, ale właściwość media_property nie udało się zaimportować.

W jaki sposób mogę dodać do niego statyczne multimedia i dynamiczne multimedia oraz w jaki sposób mogę dodać moje dynamiczne multimedia w sposób, z którego django jest zadowolony?

Odpowiedz

11

Wkrótce po napisaniu powyższego pytania znalazłem technikę, która działa. Zamiast definiować klasę Media, po prostu ręcznie dodaję WSZYSTKIE moje css/js metodą media:

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 
Powiązane problemy