问题 1 的答案:
将特定应用的静态文件放在应用的文件夹中,而不是项目的“静态”文件夹中。
/project/
/polls/
/static/
/polls/
foobar.css
foobar.js
/templates/
/polls/
vote.html
/static/
specific-to-the-project.js
/templates/
specific-to-the-project.html
base.html
关键是您的应用文件夹中有一个static 文件夹,并且其中有一个与您的应用同名的文件夹。
当您运行 collectstatic 时,它将收集在这些文件夹中找到的所有文件。
注意,在引用文件时,您将执行类似...
{% load staticfiles %}
{% static 'app/foobar.css' %}
问题 2 的答案:
当您运行collectstatic 时,它会收集所有文件并将它们复制到一个由STATIC_ROOT 设置指定的中心位置。
问题 3 的答案:
不,因为您不处理 STATIC_ROOT 中的文件。您只需在原始位置处理文件,然后在准备好时运行collectstatic。
问题 4 的答案:
你可以做一个符号链接..
不过,这确实是 staticfiles 应用程序的用途。我建议对其进行改编并在此处阅读:https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/
更新回复评论
最佳做法是使用/<project_root>/polls/static/polls/foobar.css 而不是/<project_root>/polls/static/foobar.css。然后从您的模板通过{% static 'polls/foobar.css' %} 而不是{% static 'foobar.css' %} 访问foobar.css。请参阅下面的示例。
示例
在运行 collectstatic 之前
/<project_root>
/polls
views.py
urls.py
...
/templates
vote.html
...
/static
/polls
foobar.css
foobar.js
/otherapp
views.py
urls.py
...
/templates
hello.html
...
/static
foobar.css
foobar.js
/<static_root>
(empty)
运行 collectstatic 之后
/<project_root>
/polls
views.py
urls.py
...
/templates
vote.html
...
/static
/polls
foobar.css
foobar.js
/otherapp
views.py
urls.py
...
/templates
hello.html
...
/static
foobar.css
foobar.js
/<static_root>
foobar.css
foobar.js
/polls
foobar.css
foobar.js
每个应用中的静态文件夹的内容都复制到STATIC_ROOT目录中。
将文件直接放在静态文件夹中而不是再添加一个目录并将它们放在那里,可能会导致文件名冲突。
当您从事开源项目并且不知道应用程序将安装在哪里时,这一点更为重要。但这也被认为是最佳实践:)(我花了一段时间来适应它,但没有回头。)
此外,只要 INSTALLED_APPS 中列出了“polls”,就无需将“polls/static/polls”添加到 STATICFILES_DIRS。