Django:在404模板中的静态文件

0 投票
3 回答
3298 浏览
提问于 2025-04-17 05:17

如何在默认视图中将样式表和图片包含到404页面模板中?

我在网站的templates目录下创建了一个404.html文件:

<!DOCTYPE html>
<html>
<head>
    {% load static %}
    <link rel="stylesheet" href="{% get_static_prefix %}css/404.css" />
</head>
<body class="page-404">
    <p>Not found.</p>
</body>
</html>

有趣的是,404.css文件找不到。这个404.css文件其实是在某个应用的static目录里。

服务器是通过manage.py runserver启动的。在其他所有页面上,静态文件都能正常显示。

更新:看起来在settings.py中把DEBUG = False设置后,其他所有页面的静态文件也都无法显示了。

3 个回答

0

当我把DEBUG设置为True时,我通常会在我的根网址配置中放入这段代码:

(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}),
0

因为 contest_processor.static 已经在 TEMPLATE_CONTEXT 里面了!所以你可以直接在你的模板中使用变量 STATIC_URL:可以参考这个文档:

https://docs.djangoproject.com/en/1.3/ref/templates/api/#django-core-context-processors-static

如果 TEMPLATE_CONTEXT_PROCESSORS 包含这个处理器,那么每个 RequestContext 都会包含一个变量 STATIC_URL,这个变量提供了 STATIC_URL 设置的值。

我们还知道,404 错误页面的处理程序使用了一个 RequestContext 对象,以下是从 django.views.defaults.py 中提取的代码:

return http.HttpResponseNotFound(t.render(RequestContext(request, {'request_path': request.path}))) 

所以在你的模板中只需要使用 {{ STATIC_URL }},这样就可以了!

2

看起来,staticfiles 应用在 DEBUG = False 的情况下是可以工作的。只是它不会从各个应用的 static 目录中获取文件。它会从全局的 STATIC_ROOT 目录中提供文件(这个目录是在 settings.py 文件中设置的)。

要把静态文件复制到 STATIC_ROOT,你需要运行一个叫做 collectstatic 命令

python manage.py collectstatic

撰写回答