ModelAdmin Medi中的Django CachedStaticFilesStorage

2024-09-30 10:33:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是django1.7中的CachedStaticFilesStorage后端,在管理界面中遇到了静态文件的问题。在

ModelAdmin类中,可以定义一个带有静态文件的Media类以添加到添加/更改视图中。为了对这些文件应用哈希,我使用了static中的static函数。E、 g.:

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时,它失败了,错误如下:

^{pr2}$

实际上,您不能运行任何django命令,因为它试图加载管理应用程序,当它试图在尚未收集的静态文件上运行static命令时,它将失败。在

有人有办法解决这个问题吗?在


Tags: 文件django命令app界面定义js静态
2条回答

这里有一个灵感来源于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

您可以在表单中这样使用:

^{pr2}$

因此,在模板中,如果使用{{ my_form.media }}标记,小部件中的媒体也将呈现。在

我找到了一个解决办法,以防别人碰到这个问题。您可以在ModelAdmin类上设置一个media属性,以返回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])

相关问题 更多 >

    热门问题