2015-02-06 10 views
5

Używam backendu CachedStaticFilesStorage w Django 1.7 i mam problem z plikami statycznymi w interfejsie administratora.Django CachedStaticFilesStorage w ModelAdmin Media

W klasie ModelAdmin można zdefiniować klasę Media za pomocą plików statycznych, które można dodać do widoków Dodaj/Zmień. Aby zastosować skrót do tych plików, używam funkcji static w django.contrib.staticfiles.templatetags.staticfiles. Np .:

from django.contrib.staticfiles.templatetags.staticfiles import static 

class MyAdminClass(admin.ModelAdmin): 

    class Media: 
     js = [ 
      static('app/static_file.js'), 
      static('app/static_file_2.js'), 
     ] 

ten pojawił się działać, ponieważ pliki statyczne zostały już zebrane zanim ta zmiana została dokonana. Ale kiedy usunąć pliki statyczne i próbować uruchomić collectstatic nie powiedzie się z powodu błędu:

ValueError: The file 'app/static_file.js' could not be found with <django.contrib.staticfiles.storage.CachedStaticFilesStorage object at 0x80910a9d0> 

W rzeczywistości, nie można uruchomić dowolną komendę django, jak to próbuje załadować aplikacji administratora i to zawiedzie, gdy dochodzi do próby uruchomienia polecenia static w statycznym pliku, który nie został jeszcze zebrany.

Czy ktoś ma pomysły na obejście tego?

+2

Wpadłem też na to. Wygląda na to, że zespół Django pracuje nad poprawką. https://github.com/django/django/pull/5571/files –

+2

Tutaj jest bilet: https://code.djangoproject.com/ticket/21221 –

Odpowiedz

1

Znalazłem rozwiązanie tego problemu, na wypadek, gdyby ktoś inny napotkał ten problem. Można ustawić właściwość multimediów na klasie ModelAdmin, aby zwrócić klasę nośnika i wstrzymać ładowanie nośnika.

from django.forms import Media 

@property 
def media(self): 
    js = [ 
     'app/static_files.js', 
     'app/static_files_2.js', 
    ] 

    return Media(js=[static(path) for path in js]) 
+0

Mam ten sam problem i obejście problemu działa dla mnie. Nie jestem pewien, czy warto zgłosić to jako błąd, ponieważ nie jest udokumentowane używanie plików poza szablonami tagu 'statycznego'. – Stan

+0

Byłem zbyt entuzjastyczny! To rozwiązanie nie renderuje mediów w polu. – Stan

1

Oto urywek inspirowany z jednej OP, który zarządza nośnika z widgetami:

from django.contrib.admin.templatetags.admin_static import static 
from django.forms import Media 

def get_cached_media(form, js, css): 
    """Fix collectstatic when using CachedStaticFilesStorage """ 
    media = Media(js=[static(path) for path in js], 
       css=dict([ 
        (key, [static(path) for path in paths]) 
        for key, paths in css.items() 
       ])) 
    if form.fields: 
     for field in form.fields.values(): 
      media = media + field.widget.media 
    return media 

Że można użyć takiego w swoich formach:

class MyForm(forms.ModelForm): 
    # fields 

    @property 
    def media(self): 
     js = ['my/js/stuffs.js'] 
     css = { 
      'all': (
       'my/css/forms.css', 
       'my/css/stuffs.css', 
      ) 
     } 
     return get_cached_media(self, js, css) 

więc, że w szablon, jeśli użyjesz znacznika {{ my_form.media }}, media z widżetów również zostaną wyrenderowane.

Powiązane problemy