我正在第一次写一个Django应用程序,所以如果我有点落后于事情,请耐心等待。
以下是我的settings.py:
的摘录STATIC_ROOT = os.getcwd().replace('\\','/') + '/static'
STATIC_URL = '/static_files/'
STATICFILES_DIRS = (
os.getcwd().replace('\\','/') + '/static'
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
注意:我希望os.getcwd()...
行有效。我很确定这不是我的问题,但如果这是一个问题,请告诉我。它是用于本地开发目的的占位符,因此在部署时不要担心它会保留在那里。
我的第一个问题是模板变量似乎不起作用。
摘自我的主模板文件:
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL|default:'/static_files/' }}css/base.css" />
我最初只有{{ STATIC_URL }}
,但这根本没有返回,所以我尝试添加|default:'...'
。这确实在生成的HTML中成功生成了给定的字符串,但仍然无法正常工作,这使我第二次(也是更重要的,诚实的)问题。
我根本无法使用静态文件。我在这里尝试了几种不同的方法。我已尝试在上述STATIC_*
个变量中设置绝对路径和相对路径(以各种组合方式),我尝试使用等效的MEDIA_URL
变量,我尝试将以下内容放入urls.py
{{ 1}}:
urlpatterns = ('',
# ...
(r'^static_files/(?P<path>.*)$',
'serve', {
'document_root': '/path/to/django/dir/static_files/',
'show_indexes': True
}
),
)
(我抓住了http://www.arthurkoziel.com/2008/09/02/handling-static-files-django/上面的代码段。)
现在我应该注意,一旦初始开发完成,我希望最终能够从并行Apache进程提供静态文件,但我仍然真的想知道我做错了什么。我无法在线或在StackOverflow上找到关于静态文件的相当全面的教程。
非常感谢所有帮助。
编辑:如果它很重要,我使用Python 2.7在Windows 7上。
答案 0 :(得分:3)
一种可能性 - 除非您传入RequestContext,否则不会在模板中填写STATIC_URL。
确保您的观点中包含以下内容:
return render_to_response(template, context, context_instance=RequestContext(request))
从Django 1.3开始,您还可以使用新的快捷方式:
return render(request, template, context)
另外,请确保您的上下文处理器中有'django.core.context_processors.static'。
编辑:第二个问题的可能答案,请尝试更改
STATICFILES_DIRS = (
os.getcwd().replace('\\','/') + '/static'
)
到
STATICFILES_DIRS = (
os.getcwd().replace('\\','/') + '/static',
)
编辑2:更多可能的修复
您可以删除STATICFILES_FINDERS。你只将它设置为默认值,所以除非你打算稍后再展开它,否则它就会摆脱它(少一点就会出错)。
您还可以删除urlpatterns条目。没必要。
您的STATIC_ROOT可能不正确。这应该是Django在您转移到生产环境时收集项目中所有静态文件(包括STATICFILES_DIRS中描述的目录)的地方。
我的典型settings.py示例:
PROJECT_DIR = os.path.dirname(__file__)
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(PROJECT_DIR, 'static'),
)
STATIC_ROOT = '/var/www/myproject_staticfiles/'
就是这样!
如果您想测试Django是否正确找到并放置您的静态文件,请尝试运行
python manage.py collectstatic
在我的情况下,这将通过我的项目目录,找到所有静态文件,然后将它们复制到'/ var / www / myproject_staticfiles /',在那里我可以使用apache托管它们。
Django dev服务器自动提供项目文件夹中的静态文件,因此在开发时不需要collect_static。在进入生产阶段之前,您甚至不需要设置STATIC_ROOT。