user623990
user623990

Reputation:

Django isn't serving static files, getting 404 errors

I can't seem to get my static files to load from my templates. I've followed the official documentation but I must be missing something.

My directory layout (generated by Django, most files omitted):

myproject
  myproject
    settings.py
    urls.py
  static
    css
      bootstrap.css
      main.css
  templates
    base.html
  myapp1
  myapp2
  ...
  manage.py

My settings.py:

STATIC_URL = 'static/'

I'm referencing my stylesheets like so (from my templates):

{% load staticfiles %}
<link rel="stylesheet" href="{% static "css/bootstrap.css" %}" type="text/css">
<link rel="stylesheet" href="{% static "css/style.css" %}" type="text/css"> 

Which gives this once rendered (in HTML):

<link rel="stylesheet" href="static/css/bootstrap.css" type="text/css">
<link rel="stylesheet" href="static/css/style.css" type="text/css"> 

Yet these links don't actually lead anywhere (when I visit them I get 404 error from Django). I feel that I could fix this by adding something in urls.py, but I thought Django did this automatically when you run the server? What am I missing?

Upvotes: 13

Views: 30045

Answers (8)

Godfrey Oyugi
Godfrey Oyugi

Reputation: 1

Make sure that you have the static folder set up in the right place, that is if it is in the app folder, then you can get further clarification from this helpful resource1.

Upvotes: 0

maximm
maximm

Reputation: 1

My solution was DEBUG = True in settings.

Upvotes: -6

My problem was solved by adding "STATICFILES_DIRS" in settings.py file

STATIC_URL = '/static/'
STATICFILES_DIRS = ( os.path.join('static'), )

Upvotes: 3

user3489965
user3489965

Reputation: 1

I encountered this problem too. And I solved the problem by revising the href like this:

<html>
<link rel="stylesheet" href="{{STATIC_URL}}css/bootstrap.css" type="text/css">
<link rel="stylesheet" href="{{STATIC_URL}}css/style.css" type="text/css"> 
</html>

Upvotes: 0

Amar Kamthe
Amar Kamthe

Reputation: 2582

This is the working solution for static/media/template access in django for windows,

settings.py

import os.path

STATIC_ROOT = ''

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join('static'),
)

Upvotes: 3

Rachid
Rachid

Reputation: 2579

Check if STATICFILES_FINDERS is defined in your settings.py

https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_FINDERS

The default value of STATICFILES_FINDERS is good enough but you have 2 choices :

  • you need to have the static file inside an app and having this app in your INSTALLED_APPS

  • or you need to define STATICFILES_DIRS with your path to the static files if expect the behavior being the one of django.contrib.staticfiles.finders.FileSystemFinder

Upvotes: 2

slow_mondays
slow_mondays

Reputation: 871

Have you defined your static files directory in settings.py ?

I'm guessing you have 'django.contrib.staticfiles', in your installed apps.

If you haven't defined your static files dir, you could by doing something like this:

import os.path

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))

STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static'),
)

Upvotes: 21

Daniel Roseman
Daniel Roseman

Reputation: 599490

I thought Django did this automatically when you run the server?

Why did you think that? If you've followed the official documentation, you won't have found that. Read what you have to do to serve them in development here.

There's another problem. Your STATIC_URL is a relative link, so browsers add it to the existing page URL. So if you're on page /foo, 'static/css/style.css' evaluates to /foo/static/css/style.css'.

Make sure it either starts with / - ie /static/ - or is a full URL, ie http://myserver.com/static/.

Upvotes: 1

Related Questions