Python Django CachedStaticFiles存储在ModelAdmin介质中

Python Django CachedStaticFiles存储在ModelAdmin介质中,python,django,django-admin,Python,Django,Django Admin,我正在使用Django 1.7中的CachedStaticFilesStorage后端,并且在管理界面中存在静态文件问题 在ModelAdmin类中,您可以定义一个Media类,其中包含要添加到添加/更改视图的静态文件。为了将散列应用于这些文件,我使用了django.contrib.staticfiles.templatetags.staticfiles中的static函数。例如: from django.contrib.staticfiles.templatetags.staticfiles

我正在使用Django 1.7中的CachedStaticFilesStorage后端,并且在管理界面中存在静态文件问题

ModelAdmin
类中,您可以定义一个
Media
类,其中包含要添加到添加/更改视图的静态文件。为了将散列应用于这些文件,我使用了
django.contrib.staticfiles.templatetags.staticfiles
中的
static
函数。例如:

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>
ValueError:无法使用找到文件'app/static_file.js'
事实上,您不能运行任何django命令,因为它试图加载管理应用程序,当它试图对尚未收集的静态文件运行
static
命令时失败


有人对此有什么想法吗?

我找到了一个解决方案,以防其他人遇到这个问题。您可以在ModelAdmin类上设置媒体属性以返回媒体类并延迟媒体加载

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

下面是一个灵感来自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}
标记,小部件中的媒体也将被呈现。

也遇到了同样的问题,解决方法对我有效。不确定是否值得将其作为一个bug报告,因为在模板文件之外使用
static
标记并没有文档记录。我太热情了!此解决方案不会渲染字段的媒体。我也遇到了此问题。Django团队似乎正在对此进行修复。这是票: