如何在Django页面中链接资源

0 投票
2 回答
695 浏览
提问于 2025-04-18 06:36

假设我有一个HTML页面(base.html),它需要包含一个JavaScript文件。

<script type="text/javascript" src="/js/main.js"></script>

我了解到,Django项目并不是放在一个公开的文件夹里。相反,用户的请求会被发送到views.py,然后这个文件会生成一个响应。

假设我的项目目录结构是这样的:

- project
- project_app
    - views, models, ecc…
- templates
    - base.html
    - css
        - main.css
    - js
        - main.js

那么,为什么base.html可以引用main.cssmain.js呢?如果我访问myserver.com/js/main.js,应该不会返回任何内容(因为模板文件夹不是公开的)。但是浏览器需要访问这些文件,我也需要把它们包含进来。

我是否需要写一个特定的URL规则,把对/js/main.js的请求重定向到实际的js文件,还是有什么特别的方式可以让简单的HTML包含工作呢?

2 个回答

1

你需要把所有的静态文件放到一个叫 STATIC_ROOT 的文件夹里。可以通过运行命令 django-admin.py collectstatic 来完成这个操作,然后再提供这个文件夹的服务。想要了解更多细节和解释,可以查看这里:

https://docs.djangoproject.com/en/dev/howto/static-files/#managing-static-files-css-images

1

通常的方法是把你的CSS、JavaScript和类似的文件放在一个叫做static的文件夹里,然后在你的HTML中引用它们。你可以在这里找到Django的相关文档。

简单来说,你的文件夹结构大概是这样的:

- project
- project_app
    - views, models, ecc…
- templates
    - base.html
- static
    - css
        - main.css
    - js
        - main.js

接着,你的base.html文件会用下面的方式来引用这些文件:

<script type="text/javascript" src="/static/js/main.js"></script>

我前面提到的文档说明了如何在生产环境中提供静态文件。很多人会使用内容分发网络(CDN)来提供他们的静态文件。比如,亚马逊的S3服务就是一个例子。然后,你需要在settings.py文件中把STATIC_URL的设置改成你的S3存储桶(或者类似的网络)。这样,你就可以在模板中引用STATIC_URL了。

{% load static %}
...
<script type="text/javascript" src="{% static 'js/main.js' %}"></script>
...

你会使用像./manage.py collectstatic这样的命令来收集你的静态文件,并在特定的时间把它们移动到你的CDN上。关于collectstatic的基本信息可以在这里找到。

撰写回答