【发布时间】:2020-01-08 09:06:31
【问题描述】:
我最近开始了一个基本的 django 项目,我想加载一个已经制作好的默认模板。这个模板有一个包含所有 CSS、JS 文件等的 assets 文件夹
这个文件夹,稍后在模板中调用,所以例如我可以有:
<base href="../">
// And a lot of static files being called like this:
<link href="./assets/scrollbar/css/scrollbar.css" rel="stylesheet" type="text/css" />
<link href="./assets/somecss.css" rel="stylesheet" type="text/css" />
// And so on..
<script src="./assets/somejsfile.js" type="text/javascript"></script>
这样做的问题是没有检索资产中的文件。我知道问题取决于我将资产文件夹放在哪里,但我不知道如何解决。我试图将它添加到我项目结构的不同部分,但它不起作用,因为我只收到很多这样的错误:
http://127.0.0.1:8000/assets/somecss.css net::ERR_ABORTED 404 (Not Found)
这是我的 settings.py:
STATIC_URL = '/static/'
在这个静态文件夹中,有一个我在尝试之前测试过的基本 css 文件。
这是我的项目的结构:
//MAIN FOLDER
migrations
ASSETS
templates -> INDEX.HTML (where the assets folder is called)
views, forms etc
【问题讨论】:
-
URL 和文件系统路径是有区别的。在 URL 中包含
./没有意义。 URL 由 Web 服务器映射到文件系统位置,如果您在开发服务器上,则由 djangorunserver映射。STATIC_URL告诉 django 静态文件的 URL 前缀是什么(如果你使用{% static %}模板标签,它会被添加到 URL 中)。STATICFILES_DIRS告诉 django 在哪里查找静态文件(除了默认使用的static应用程序目录),只要您使用 django.contrib.staticfiles 应用程序。 -
并且不要将静态文件放在模板文件夹中。模板不是静态的,它们用于呈现最终的 HTML 响应。如果你这样做,你最终会发生冲突。
-
感谢您的回答@dirkgroten。基本上,我的麻烦在于,由于我使用的是预制模板,因此我必须将调用静态内容的每一行基本上都更改为 django 调用静态内容的方式
-
嗯……是的,不是的。如果您的所有静态链接都以
/assets/开头,则将您的 STATIC_URL 设置为“/assets/”,并将您的 STATICFILES_DIRS 设置为包含 assets 目录(该目录也应该在 templates 之外)。这将在开发中起作用。但是预制模板中不应该有“./assets”,这不是 url 的工作方式,如果这样做,您的模板就不好。此外,它还难以在生产中扩展,因为这意味着您必须从为 Django 提供服务的同一 Web 服务器提供静态文件(例如,您将无法使用子域和 CDN)。 -
无论如何,用正确的 {% static %} url 一次性替换所有以 ./assets 开头的静态 url 应该很容易。这就是文本编辑器所做的。
标签: django templates django-templates