我有应用级的静态文件,并且希望提供全局静态文件(例如JQuery),我的项目结构如下:
mysite
├───dashboard
│ ├───migrations
│ ├───static
│ │ └───dashboard
│ │ ├───css
│ │ ├───img
│ │ └───js
│ └───templates
│ └───dashboard
├───etc
├───static
│ └───js
| └───jquery.min.js
└───mysite
我添加了以下django文档,以便settings.py看上去
STATIC_ROOT = ""
STATIC_URL = '/static/'
STATICFILES_DIR = [
os.path.join(BASE_DIR, "static"),
os.path.join("static"),
]
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
我的urls.py看起来像这样
urlpatterns = [
path('admin/', admin.site.urls),
path("", include(dashboard.urls)),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
我的INSTALLED_APPS看起来像这样
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"dashboard",
]
当我尝试从模板访问它时,它会在运行服务器日志中返回响应代码404
[09/Apr/2020 01:59:34] "GET /static/js/jquery.min.js HTTP/1.1" 404 1674
模板标签是这样的
{% load static %}
<script src="{% static 'js/jquery.min.js' %}"></script>
这是我第一个不遵循教程的Django项目,我们将不胜感激。谢谢
编辑:我可以通过删除STATIC_ROOT
设置来解决问题
答案 0 :(得分:0)
您需要在名为static
的两个目录之一之前指定前缀,因为Django将使用它找到名称匹配的第一个静态文件,并且如果您在目录中有一个具有相同名称的静态文件,在不同的应用程序中,Django将无法区分它们。我们需要能够将Django指向正确的人,而确保这一点的最佳方法是通过namespacing
他们。也就是说,将这些静态文件放置在为应用程序本身命名的另一个目录中。
您可以通过指定prefixes在STATICFILES_DIRS中为静态资产命名空间。例如:
STATICFILES_DIR = [
("main", os.path.join(BASE_DIR, "static")),
os.path.join("static"),
]
然后:
<script src="{% static 'main/js/jquery.min.js' %}"></script>