【问题标题】:Django CachedStaticFilesStorage in ModelAdmin MediaModelAdmin 媒体中的 Django CachedStaticFilesStorage
【发布时间】:2015-02-06 12:54:29
【问题描述】:

我在 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>

事实上,您无法运行任何 django 命令,因为它会尝试加载管理应用程序,并且在尝试对尚未加载的静态文件运行 static 命令时失败还没有收集到。

有没有人想办法解决这个问题?

【问题讨论】:

标签: python django django-admin


【解决方案1】:

我找到了解决方案,以防其他人遇到此问题。您可以在 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])

【讨论】:

  • 遇到了同样的问题,解决方法对我有用。不确定是否值得将其报告为错误,因为没有记录在模板文件之外使用 static 标记。
  • 我太热情了!此解决方案不会呈现字段的媒体。
【解决方案2】:

这里的 sn-p 受 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 }} 标签,来自小部件的媒体也会被渲染。

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 2011-08-09
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2020-06-15
    • 2014-03-24
    相关资源
    最近更新 更多