从Django的根目录提供静态文件

时间:2020-04-09 06:12:14

标签: python django

我有应用级的静态文件,并且希望提供全局静态文件(例如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设置来解决问题

1 个答案:

答案 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>