2015-02-06 3 views
5

Я использую бэкэнд CachedStiles в Django 1.7 и имею проблему со статическими файлами в интерфейсе администратора.Django CachedStaticFilesStorage в ModelAdmin Media

В классе ModelAdmin вы можете определить класс Media со статическими файлами, которые будут добавлены в списки добавления/изменения. Чтобы применить хэш к этим файлам, я использую функцию static в django.contrib.staticfiles.templatetags.staticfiles. Например:

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'), 
     ] 

Это похоже на работу, потому что статические файлы уже были собраны до того, как это изменение было сделано. Но, когда я удалить статические файлы и пытаться запустить collectstatic он терпит неудачу с ошибкой:

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

В самом деле, вы не можете запустить любую команду Джанго, как он пытается загрузить приложение администратора и он терпит неудачу, когда он доходит до попытки запустить команду static в статическом файле, который еще не собран.

Есть ли у кого-нибудь идеи об этом?

+2

Я столкнулся с этим также. Кажется, команда Django работает над исправлением этого. https://github.com/django/django/pull/5571/files –

+2

Вот билет: https://code.djangoproject.com/ticket/21221 –

ответ

1

Я нашел решение для этого, если кто-то еще сталкивается с этой проблемой. Вы можете установить свойство media в классе ModelAdmin, чтобы вернуть класс Media и отложить загрузку носителя.

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

Получил ту же проблему, и обходной путь работает для меня. Не уверен, стоит ли сообщать об этом как об ошибке, так как использование тега 'static' вне файлов шаблонов не документируется. – Stan

+0

Я был слишком в восторге! Это решение не отображает медиа. – Stan

1

Вот отрывок вдохновлен одной OP, что управлять медиа от виджетов:

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 

Что вы можете использовать как и в ваших формах:

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) 

Так что в вашем шаблон, если вы используете тег {{ my_form.media }}, будут отображаться средства из виджетов.