Django:在404模板中的静态文件
如何在默认视图中将样式表和图片包含到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 个回答
当我把DEBUG设置为True时,我通常会在我的根网址配置中放入这段代码:
(r'^static/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.STATIC_ROOT}),
因为 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 }}
,这样就可以了!
看起来,staticfiles
应用在 DEBUG = False
的情况下是可以工作的。只是它不会从各个应用的 static
目录中获取文件。它会从全局的 STATIC_ROOT
目录中提供文件(这个目录是在 settings.py
文件中设置的)。
要把静态文件复制到 STATIC_ROOT
,你需要运行一个叫做 collectstatic
命令:
python manage.py collectstatic