2012-04-18 12 views
12

Soy un novato de Django que trabaja en mi primer proyecto y tiene un problema con los archivos estáticos.Los archivos estáticos de Django no se cargarán

He creado un sistema de autenticación simple usando django.contrib.auth que consta de dos plantillas: mysite/templates/index.html y mysite/templates/registration/login.html. Tengo contenido estático global en mysite/static al que deseo poder acceder en todas las plantillas presentadas por todas las aplicaciones.

mysite/templates/index.html contiene <img src="{{ STATIC_URL }}pics03.jpg"/> que hace que "static/pics03.jpg" y cargas bien cuando vuelva a la url localhost:8000/

mysite/templates/registration/login.html contiene <img src="{{ STATIC_URL }}pics03.jpg"/> que también se renderiza como "static/pics03.jpg" y no se carga cuando vuelva a la url "localhost:8000/accounts/login/"

En mis URL. py tengo:

urlpatterns = patterns('', 
    url(r'^$', 'mysite.views.home'), # plays index.html template 
    url(r'^accounts/login/$', 'django.contrib.auth.views.login'), 

En mi settings.py tengo:

PROJECT_DIR = os.path.dirname(__file__) 

STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
    os.path.join(PROJECT_DIR,'static'), 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
) 

STATIC_URL = '/static/' 

STATIC_ROOT = '' 

Yo tenía la impresión de que Django debería estar buscando contenido estático global en STATICFILES_DIRS, pero no encuentra el contenido estático para login.html incluso si cambio de la url de allí a una ruta absoluta a la carpeta estática ¿Alguien puede aclarar esto?

Respuesta

18

Su problema es que te enviaban escuchar a la URL "/ static /" en ninguna parte de su urls.py

Si va a servir a su aplicación a través de un servidor web como Apache o Nginx entonces esto es normal, ya que el servidor web manejaría los archivos estáticos en sí.

Para el desarrollo de Django incluye un servidor estático incorporado

a urls.py, al final añadir

from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
urlpatterns += staticfiles_urlpatterns() 

Lo que esto hace es añadir el/estática/url y le permiten servir a aquellos sin un servidor web.

Esto es equivalente a

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

algunas personas le dirá que usted necesita para envolver los URL-reglas en un "si settings.DEBUG", para usar el dev-únicas reglas, pero esto no es necesario en todo y, de hecho, creo que es un mal consejo.

+0

sí, este es el problema ... ¡gracias! – JimJay

+0

Bueno, en realidad en este último caso es necesario ajustar esa regla. Si echas un vistazo al código de django, verás que la vista no hace ninguna comprobación de DEPURACIÓN. –

+2

La vista nunca se ve afectada porque su servidor web está configurado para capturarlos y servir archivos estáticos, por lo que no es necesario verificarlos. – krs

1

¿Tiene problemas al utilizar la compilación en el servidor o está sirviendo usando Apache o similar? He luchado con esto un poco. La documentación que sigo es: https://docs.djangoproject.com/en/dev/howto/static-files/

La segunda parte es clave cuando está listo para implementar. Debe definir una raíz estática (que estará vacía para comenzar) y ejecutar el comando manage.py collectstatic para mover los archivos estáticos de su proyecto a esa carpeta. Entonces puedes servirlos desde allí.

+0

Estoy usando runserver actualmente, no estoy listo para implementar – JimJay

0

¿Cambia STATIC_ROOT='' a STATIC_ROOT='/' ayuda?

Me parece que la única diferencia es que static/pics03.jpg (ruta relativa) existe en la página de inicio, pero no en el otro.

La ruta absoluta /static/pics03.jpg existe en ambos casos. Si cambiar STATIC_ROOT no ayuda, simplemente agregue un / al comienzo de las direcciones URL.

Cuestiones relacionadas