我正在开发一个由许多应用程序组成的Django(1.3)项目。每个应用程序在其自己的static
目录下都有自己的静态文件。此外,我添加了一个名为project_static
的目录,该目录应包含在各种应用程序中常见的静态文件,例如jQuery。
我遇到的问题是命名冲突。默认情况下,collectstatic
只会将所有内容放在全局static
目录下,而不会按应用程序对其进行分类。这对我不起作用,因为每个应用程序都有一个名为css/screen.css
的文件。
我解决它的方法是从django.contrib.staticfiles.finders.AppDirectoriesFinder
移除STATICFILES_FINDERS
并使用namespaced static files dirs,所以我的设置现在看起来像:
STATICFILES_DIRS = (
os.path.join(PROJECT_PATH, 'project_static'),
('my_app', os.path.join(PROJECT_PATH, 'my_app', 'static')),
('another_app', os.path.join(PROJECT_PATH, 'another_app', 'static')),
...
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
)
问题在于,这样我丢失了所有其他应用程序的静态文件(例如django.contrib.admin
)。当然我可以手动添加管理员,但我不知道如何在不破坏管理员的情况下执行此操作,管理员具有不同的目录结构。
是否有更好的方法来管理具有多个应用程序的静态文件?
答案 0 :(得分:45)
这与使用特定于应用程序的templates
目录时出现的问题相同。如果您只是将文件直接放在应用程序中的templates
下,如果两个应用程序甚至项目级templates
目录使用相同名称的模板,您最终会遇到名称冲突。解决方法是将模板实际放在templates
目录中的app名称目录中,如:
- some_app
- templates
- some_app
- index.html
所以,我将同样的想法应用于静态:
- some_app
- static
- some_app
- css
- img
- js
这样,当您运行collectstatic时,每个应用程序的静态文件都会放在命名空间目录中。您需要做的唯一更改是在模板中使用app-name目录为每个文件添加前缀。因此,{{ STATIC_URL }}css/style.css
取代{{ STATIC_URL }}my_app/css/style.css
而不是{{1}}。