¿Por qué mi CSS estático no funciona en Django?

7 minutos de lectura

avatar de usuario
austint

Tengo un problema con mi CSS estático que no funciona para mi aplicación web Django. He seguido las instrucciones del Tutorial de enlaces estáticos de Django en el manejo de archivos estáticos, pero aún no funciona.

Ajustes

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = '/Users/a9austin/Development/sites/AlphaSocks/src/static_root/'

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# Additional locations of static files
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.
'/Users/a9austin/Development/sites/AlphaSocks/src/staticfiles'

)

vista

#from django.http import HttpResponse
from django.shortcuts import render_to_response


def index(request):
return render_to_response('index.html')

índice.html

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

Y mi organización de directorio es

src->archivos estáticos->css->estilo.css

  • ¿’Qué’ no funciona? ¿Cómo renderizas tus vistas, usando render() o render_to_response()? ¿Está activado el procesador de contexto de archivos estáticos en settings.py?

    – Jure C.

    19 de noviembre de 2012 a las 1:06

  • Sí, estoy usando render_to_response, lo actualizaré con mi vista. No funciona por el css en realidad no está cambiando mi html.

    – AustinT

    19 de noviembre de 2012 a las 1:11


  • vea esta publicación para manejar archivos estáticos

    – Otskimanot Sqilal

    19 de noviembre de 2012 a las 1:15

  • @OtskimanotSqilal Gracias por la respuesta, acabo de actualizarlo con mi STATICFILES_DIR, mi css todavía no aparece.

    – AustinT

    19 de noviembre de 2012 a las 1:32

  • La forma en que configuró STATICFILES_DIRS y STATIC_ROOT Es incorrecto. No pueden contener los mismos directorios. Consulte mi respuesta para obtener más información.

    – miki725

    19 de noviembre de 2012 a las 1:50

avatar de usuario
miki725

Para que Django sirva archivos estáticos, debe asegurarse de tener un par de configuraciones.

STATIC_URL

Esta configuración especifica a qué URL deben asignarse los archivos estáticos. Ya lo tienes hecho.

STATICFILES_DIRS

Esto especifica todas las carpetas en su sistema donde Django debería buscar archivos estáticos. La idea es que podría tener un par de aplicaciones dentro de su proyecto, y cada aplicación podría requerir un conjunto diferente de archivos estáticos. Entonces, por motivos organizativos, cada aplicación puede contener un static directorio donde almacenará solo sus archivos estáticos. Entonces Django tiene que tener una forma de saber dónde están esos directorios. Para eso es esta configuración.

RAÍZ_ESTÁTICA

Esta configuración especifica dónde copiará Django todos los archivos estáticos y no dónde ya están los archivos estáticos. La idea es que una vez que dejas el desarrollo en producción, Django ya no puede servir archivos estáticos debido a problemas que no abordaré aquí (está en el artículo). Sin embargo, para la producción, todos los archivos estáticos deben estar en un solo directorio, en lugar de muchos como se especifica en STATICFILES_DIRS. Entonces, esta configuración especifica un directorio al que Django copiará todos los archivos estáticos desde todos los archivos dentro STATICFILES_DIRS ejecutando el siguiente comando:

$ python manage.py collectstatic

Tenga en cuenta que esto solo es necesario una vez que entre en producción y también que el directorio especificado aquí no puede ser el mismo que cualquier directorio especificado en STATICFILES_DIRS.

Urls.py

En el desarrollo de Django para servir sus archivos estáticos, debe incluir las URL estáticas en su urls.py:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

urlpatterns = ...

urlpatterns += staticfiles_urlpatterns()

Una vez que haya completado todas las cosas anteriores, sus archivos estáticos deben servirse siempre que tenga DEBUG = True. Fuera de la lista anterior, parece que solo completas STATIC_URL. También tenga en cuenta que todos los pasos que describí anteriormente están en los documentos que vinculó en su pregunta (Enlace). Puede ser un poco confuso al principio, pero si lo lees un par de veces, se vuelve más claro.

  • Gracias por la respuesta. Déjame asegurarme de que entiendo. Entonces STATICFILES_DIR es realmente donde están los archivos estáticos. ¿Y STATIC_ROOT es donde Python los copiará/manejará?

    – AustinT

    19 de noviembre de 2012 a las 2:15

  • Sí, pero solo los copiará ejecutando el manage.py mando y sólo es necesario para la producción. En desarrollo, Django buscará y servirá archivos estáticos ubicados en cualquiera de los directorios en STATICFILES_DIRS. También olvidé mencionar, en la vista, asegúrese de usar RequestContext para poder usar {{ STATIC_URL }}. La respuesta de Kavanaugh Development lo demuestra.

    – miki725

    19 de noviembre de 2012 a las 2:18

  • De acuerdo, cuando llamé a python manage.py collectstatic, me da un error. ‘”Su configuración STATICFILES_DIRS no es una tupla o lista; ” django.core.exceptions.ImproperlyConfigured: Su configuración STATICFILES_DIRS no es una tupla o lista; ¿quizás olvidaste una coma final?’ Actualicé mi publicación a lo que he cambiado mi raíz y directorio. Por favor echa un vistazo. Gracias de nuevo por ayudarme

    – AustinT

    19 de noviembre de 2012 a las 2:25

  • Derecha. Entonces tus STATICFILES_DIRS es como ( 'string_here' ) que no es una tupla. cambiar eso a ( 'string_here', ) que es una tupla de Python.

    – miki725

    19 de noviembre de 2012 a las 2:30

  • Pero, de nuevo, para el desarrollo no es necesario recopilar todos los archivos estáticos. Django les servirá desde STATICFILES_DIRS directorios directamente…

    – miki725

    19 de noviembre de 2012 a las 2:32

Intenta borrar tu caché. Si está utilizando Google Chrome, vaya a su configuración> borrar datos de navegación> seleccione borrar imágenes y archivos almacenados en caché y luego haga clic en borrar datos

Después de hacer todo, configurar DEBUG= True, python collectstatic, borrar el caché, abrir en modo de incógnito si el problema persiste, copiar el archivo .css en otro archivo .css nuevo en la carpeta estática y luego ejecutar el comando collectstatic. Esto funcionó para mí. Espero que esto ayude.

Para mi estaba cambiando

<link rel="stylesheet" href=" {% static '/css/style.css' %} ">

a

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

Agregar RequestContext a la respuesta debería cargar la variable STATIC_URL en la plantilla.

Intenta cambiar:

from django.shortcuts import render_to_response

def index(request):
    return render_to_response('index.html')

a:

from django.shortcuts import render_to_response
from django.template.context import RequestContext

def index(request):
    return render_to_response("index.html", context_instance=RequestContext(request)) 

Consulte la documentación de Django en Hacer referencia a archivos estáticos en plantillas para más información.

avatar de usuario
IndieGameDev

Si no hay problema en la codificación y no se muestran errores. Entonces puedes hacer esto para tratar de resolver el problema.

Limpia tu caché:

Si está utilizando Google Chrome, vaya a su configuración -> borrar datos de navegación -> seleccione borrar imágenes y archivos almacenados en caché y luego haga clic en borrar datos

avatar de usuario
Divino

Si esto le sucede en el modo de desarrollo, asegúrese de configurar DEBUG=True en tus settings.py expediente. También asegúrese de que el MEDIA_URL y MEDIA_ROOT están establecidos en su settings.py archivo así:

MEDIA_URL  = '/mymediafolder/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'mymediafolder')

Y luego en su archivo de URL principal myapp/urls.py debes tener lo siguiente:

from django.conf.urls import url, include
from . import views
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    #Your url patterns here
]

urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

los staticfiles_urlpatterns() se utiliza para servir archivos estáticos en modo de desarrollo.

¿Ha sido útil esta solución?