Imagen de fondo HTML

Estoy usando django e bash agregar una imagen de fondo a mi base.html, aplicándola al rest del sitio, pero he tenido problemas.

  {% load staticfiles %}  {% block title %}Local 9{% endblock %}  body { background-image: url('{{STATIC_URL}}img/background.jpg'); }    
{% block content %}{% endblock %}

Tengo el archivo en la ubicación correcta. También estoy haciendo esto en mi home.html:

 {% extends "base.html" %} {% block content %} HI {% endblock %} 

Estoy usando la configuración por defecto.py. Mi STATIC_URL = ‘/ static /’ … Estoy en una pérdida total. Cualquier pensamiento o sugerencia sería realmente útil.

Hay varias cosas que pueden ir mal con el servicio de archivos estáticos en Django. Ábrete camino a través de esta lista de verificación:

No instalado correctamente

En primer lugar, en settings.py:

 INSTALLED_APPS = ( ... 'django.contrib.staticfiles', ... ) STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage' 

La configuración STATICFILES_STORAGE dicta qué backend usará la función de collectstatic STATICFILES_STORAGE . En la implementación, esta configuración podría cambiarse para que la collectstatic estática reúna los archivos y los envíe a Amazon S3.

Ruta mal configurada o perdida

Ahora en urls.py:

 from django.conf.urls.static import static from myapp import settings urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 

Esto agrega una ruta llamada ‘estática’, que luego debe consultar en cada plantilla donde desee usar archivos estáticos:

 {% load staticfiles %}  

Archivos no encontrados por collectstatic

Si aún tiene problemas, es posible que el comando collectstatic no encuentre sus archivos. Este comando sigue ciertas reglas para encontrar sus archivos estáticos y luego copiarlos en la ubicación desde la que se van a servir. Hay un par de backends disponibles que le dicen cómo hacerlo, y están configurados en settings.py:

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

AppDirectoriesFinder funciona así: “Mire cada una de las aplicaciones en INSTALLED_APPS , y si hay una carpeta en esa aplicación llamada ‘estática’, cópiela”

El FileSystemFinder: “Copie cada uno de los directorios listados en STATICFILES_DIRS

Digamos que había estado guardando sus archivos estáticos en dos carpetas diferentes en su proyecto: ‘imágenes’ y ‘audio’. AppDirectoriesFinder no puede encontrarlos, porque no viven en una carpeta llamada ‘estática’. FileSystemFinder puede, pero solo si usa STATICFILES_DIRS para decirle exactamente dónde debe verse:

 # settings.py # Set PROJECT_DIR to be the folder where settings.py lives: PROJECT_DIR = os.path.dirname(os.path.abspath(__file__)) STATICFILES_DIRS = (os.path.join(PROJECT_DIR, 'images'), os.path.join(PROJECT_DIR, 'audio'), ) 

Debe usar las rutas completas para cada directorio en STATICFILES_DIRS , como lo he hecho aquí.

STATIC_ROOT y STATIC_URL

Ahora que se ha asegurado de que sus archivos estáticos sean STATIC_ROOT , collectstatic los recostackrá y los copiará en STATIC_ROOT . Siguiendo con mi ejemplo, podría agregar lo siguiente a mi settings.py:

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

Ahora, cuando ejecuto collectstatic , primero utilizará FileSystemFinder para localizar mis carpetas ‘imágenes’ y ‘audio’. Los copiará a la carpeta ‘estática’ ( STATIC_ROOT ). Luego, AppDirectoriesFinder se activará y buscará carpetas ‘estáticas’ en cada una de mis INSTALLED_APPS . Si he instalado Django Admin, por ejemplo, AppDirectoriesFinder encontrará los archivos estáticos en esa aplicación y los copiará.

Ahora todos los archivos están ubicados en una carpeta llamada ‘estática’ en mi proyecto. Si abro esta carpeta, espero ver copias de mis directorios ‘imágenes’ y ‘audio’, y también un directorio ‘admin’ si tuviera Django Admin instalado.

Saga interminable con la configuración estática de django. ¿Cuántas veces he pasado por eso? Aquí está (casi) cómo lo hago.

 # settings.py MEDIA_ROOT = path.join(PROJECT_DIR, 'media') MEDIA_URL = '/media/' STATIC_ROOT = os.path.join(PROJECT_DIR, 'static') STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(PROJECT_DIR, 'assets'), ) # urls.py from django.conf import settings urlpatterns = patterns('', ... # normal patterns here ) if settings.DEBUG: urlpatterns += patterns('', url(r'^static/(?P.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT, 'show_indexes': True}), url(r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}), ) 

Durante el desarrollo, mantenga sus archivos estáticos solo en el directorio de activos. Y no hagas colectividad en el desarrollo. Por si acaso, guardo la entrada /static en mi archivo .gitignore . Ejecute collectstatic solo en producción, el contenido de su directorio de activos se copiará en estática y se servirá a través de nginx (u otro servicio).

La diferencia es que uso un poco diferente de la estructura del proyecto (otros directorios) y diferentes archivos de configuración (desarrollo, organización, producción), pero debes resolverlo por ti mismo, confía en mí.