我在Django 1.7中使用CachedStaticFilesStorage后端,并且在管理界面中遇到静态文件问题。
在ModelAdmin
类中,您可以定义一个带有静态文件的Media
类,以添加到添加/更改视图中。要将哈希应用于这些文件,我使用static
中的django.contrib.staticfiles.templatetags.staticfiles
函数。 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
时,它失败并显示错误:
ValueError: The file 'app/static_file.js' could not be found with <django.contrib.staticfiles.storage.CachedStaticFilesStorage object at 0x80910a9d0>
实际上,你无法运行任何django命令,因为它试图加载管理应用程序,当它试图在静态文件上运行static
命令时它失败了尚未收集。
有没有人对此有任何想法?
答案 0 :(得分: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])
答案 1 :(得分: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 }}
标记,则小部件中的媒体也会被渲染。