Django 管理员不提供静态文件?

新手上路,请多包涵

Django 1.6

我在为我的 Django 管理员提供静态文件时遇到问题。

网址.py:

 urlpatterns = patterns('',
    url(r'^$', 'collection.views.index', name='home'),
    url(r'^collection/', include('collection.urls')),
    url(r'^admin/',    include(admin.site.urls)),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        }),
        url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.STATIC_ROOT,
        }),
)

设置.py

 ...
MEDIA_ROOT = '/Users/me/projectdir/media/'
MEDIA_URL = 'media/'

STATIC_ROOT = '/Users/me/projectdir/static/'
STATIC_URL = 'static/'
...

模板 (base.html)

 <!DOCTYPE html>
<html lang='en-us'>
<head>
<title>Mysite</title>

{% load static %}
{% block links %}
    <link href="{% static 'css/bootswatch-simplex.css' %}" rel="stylesheet" type="text/css">
    <link href="{% static 'css/custom.css' %}" rel="stylesheet" type="text/css">
    <link rel="shortcut icon" href="{% static "favicon.ico" %}">
{% endblock %}

<script src="{% static "lib/bootstrap-3.1.1-dist/js/bootstrap.js" %}"></script>
<script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% static "admin/" %}{% endfilter %}";</script>
</head>
...

Django 正在为我的管理员服务 OK,只是没有静态文件:CSS、JS 等。

我面向公众的页面的静态文件工作正常。

如果我将 STATIC_URL 更改为 '/static/' ,则情况 _正好相反_:管理员很好,但我的公共页面丢失了静态文件。

这是最奇怪的部分。如果我在浏览器中“查看”管理页面的源代码,它会显示静态页面的正确 URL,例如:

 /static/admin/css/base.css

但如果我真的点击链接,它会变成这样:

 http://localhost:8000/admin/static/admin/css/base.css

我认为它正在检查相对于 localhost:8000/admin/static/ 而不仅仅是 localhost:8000/static/ 的静态文件。它向 url 添加了一个额外的“ admin ”级别,例如 static 是域的一部分。我只是不知道如何摆脱它。

我试过 collectstatic ,但没有用。静态文件在我的静态目录中,它们只是没有被提供。例如,我可以输入 http://localhost:8000/static/admin/css/base.css 并获得正确的 CSS 文件(纯文本)。文件在那里。我敢打赌我的配置有问题。

我清空了我的缓存,重新启动了我的开发服务器,等等。没有豆子。

想法?

原文由 aljabear 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 520
2 个回答

好的,我明白了。我的设置文件有些混乱,我没有正确设置 STATICFILES_DIRS

最后,我在我的 settings 中实现了 Two Scoops of Django 1.6 中讨论的版本控制设置文件:

 from unipath import Path

BASE_DIR         =  Path(__file__).ancestor(3)
MEDIA_ROOT       =  BASE_DIR.child('media')
STATIC_ROOT      =  BASE_DIR.child('static')

TEMPLATE_DIRS    = (
    BASE_DIR.child('templates'),
)

STATICFILES_DIRS = (
    BASE_DIR.child('myapp').child('static'),
)

STATIC_URL         = '/static/'
MEDIA_URL          = '/media/'

有了这个,我的静态文件在管理员和没有管理员的情况下都得到了正确的服务。另一方面,根据 此处 接受的答案,如果不更改开发中的 urls.py ,我的媒体文件将无法工作。我不必为我的静态文件做同样的事情。

无论如何,我希望这可以帮助其他人用头撞这堵墙。

原文由 aljabear 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 django-admin.py collectstatic 或转到 ~/django/contrib/admin/static 并复制管理文件夹(其中包含静态文件)并将它们粘贴到项目的静态目录中。

**编辑**

您可以尝试一个绝望或笨拙的解决方案:将您的 STATIC_URL 更改为“/static/”,正如我从问题中看到的那样:

如果我将 STATIC_URL 更改为“/static/”,则情况正好相反:管理员很好,但我的公共页面丢失了静态文件。

然后检查 inspect element/firebug ,看看在公共页面中提供了哪些网址。可能缺少“/”或添加了“/”。调整它,看看它是否有效。

原文由 ruddra 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题