1

我目前正在通过一些教程来增强我对 Django 的了解。为此,我决定使用最新版本的 Django。我已经能够克服我的代码与本教程的代码之间的大部分分歧,除了一个 - 没有提供静态文件。现在,我不完全确定差异是否完全归因于 Django 版本。这是正在发生的事情。

我有以下项目结构:

在此处输入图像描述

设置.py

STATIC_URL = '/static/'

STATIC_FILES = (
    os.path.join(BASE_DIR, "static"),
)

STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "staticfiles", "static")

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

有趣的是,通过这种配置,项目能够成功找到模板。但是,如上所述,它找不到静态文件。这是为什么?

此外,本教程设置了一个不寻常的配置,其中statictemplates目录位于主应用程序的目录中,而我通常将它们设置为更高一级,即在项目根目录中。这可能是问题的一部分吗?这个特定项目的设置中的什么使 Django 查找低一级目录的文件?这些设置似乎与我所做的其他项目相同。但是,这些项目包含项目根目录中的static和目录。templates

任何帮助和澄清表示赞赏。

编辑:

网址.py

from django.contrib import admin
from django.urls import path
from .views import home

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home')
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
4

5 回答 5

1

尝试这个:

STATIC_ROOT = os.path.join (BASE_DIR, "taskbuster", "static")
于 2019-06-09T15:44:07.683 回答
1

尝试替换这个:

STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "staticfiles", "static")

STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "static")

还提供文件的状态(如 404 消息)

于 2019-06-09T14:10:22.480 回答
1

要提供静态文件,您需要添加以下配置urls.py

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

接下来,我认为在他们自己的应用程序中放置static和放置是一个很好的做法,如果您想在不久的将来使该应用程序可插入templates,这将很有用。

或者收集项目级目录中的所有静态文件并在设置中添加以下内容以识别它也是一个好习惯。

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

编辑:我只看到更新的问题。尝试添加这个:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home')
]

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

这就是说,只要我们处于调试模式,就可以提供静态文件。

于 2019-06-09T14:16:25.567 回答
1

据我所知,STATIC_FILES 对 Django 没有任何意义,尽管您可能将它用于其他目的。

您定义 STATIC_ROOT 的方式是指向一个不存在的目录。

StackOverflow这里有一个很好的参考

于 2019-06-09T14:17:54.483 回答
0

我能够通过将设置更改为以下内容来解决该问题:

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "static")

此外,在尝试了解如何修复它时阅读以下文档很有帮助

https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-STATICFILES_FINDERS

特别是,这清楚地解释了 Django 做了什么:

默认将查找存储在 STATICFILES_DIRS 设置(使用 django.contrib.staticfiles.finders.FileSystemFinder)和每个应用程序的静态子目录(使用 django.contrib.staticfiles.finders.AppDirectoriesFinder)中的文件。如果存在多个同名文件,将使用找到的第一个文件。

于 2019-06-09T18:49:51.907 回答