Django admin not serving static files?

aljabear picture aljabear · May 19, 2014 · Viewed 29.3k times · Source

Django 1.6

I'm having trouble serving my static files for my Django Admin.

urls.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,
        }),
)

settings.py

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

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

template (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 is serving my admin OK, just without static files: CSS, JS, etc.

Static files for my public-facing pages work fine.

If I change STATIC_URL to '/static/', then the opposite is true: the admin is fine, but my public pages lose their static files.

Here's the weirdest part. If I "view source" of my admin pages in my browser, it shows the correct URL for static pages, for example:

/static/admin/css/base.css

But if I actually follow the link, it changes it to this:

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

I think it's checking for static files relative to localhost:8000/admin/static/ instead of just localhost:8000/static/. It adds an extra "admin" level to the url, like static is part of the domain. I just can't figure out how to get rid of it.

I have tried collectstatic, but it doesn't help. The static files are in my static directory, they're just not being served. I can type in, say, http://localhost:8000/static/admin/css/base.css and I get the right CSS file (in plaintext). The files are there. I bet something is wrong with my configuration.

I've emptied my caches, restarted my dev server, etc. No beans.

ideas?

Answer

ruddra picture ruddra · May 19, 2014

Use django-admin.py collectstatic or go to ~/django/contrib/admin/static and copy the admin folder(which contains the static files) and paste them into your project's static directory.

**EDIT**

A desperate or clumsy solution you can try for: change your STATIC_URL to '/static/', as from question I saw this:

If I change STATIC_URL to '/static/', then the opposite is true: the admin is fine, but my public pages lose their static files.

Then check with inspect element/firebug, see what urls are being served in public pages. Probably a '/' missing or added a '/'. Adjust it, and see if it works.