¿Cuál es la diferencia entre {% load staticfiles%} y {% load static%}

93

La parte más importante de la pregunta está en el tema.

Me pregunto qué etiqueta es mejor para cada caso. Además ... encontré código, que también uso settings.STATIC_URLincluido {{STATIC_URL}}en las plantillas.

Estoy un poco confundido.

trikoder_beta
fuente
Solo uso STATIC_URL para todo y parece funcionar bien para mí
Maximas
1
@Maximas Funciona, pero supongo que no es la mejor práctica
KhoPhi
1
Ninguna de estas respuestas es buena. Esta es una respuesta más reciente y completa .
Jarad

Respuestas:

60

La staticetiqueta de plantilla incorporada "enlace [s] a archivos estáticos que se guardan en STATIC_ROOT".

La etiqueta de plantilla de staticfilesla aplicación contribstatic "usa el STATICFILES_STORAGEalmacenamiento configurado para crear la URL completa para la ruta relativa dada", lo cual es "especialmente útil cuando se usa un backend de almacenamiento no local para implementar archivos".

La staticdocumentación de la etiqueta de plantilla incorporada (vinculada a la anterior) tiene una nota que dice que use la etiqueta de plantilla de staticfilesla aplicación contrib static"si tiene un caso de uso avanzado, como usar un servicio en la nube para entregar archivos estáticos", y da este ejemplo de haciéndolo:

{% load static from staticfiles %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />

Podría usar en {% load staticfiles %}lugar de {% load static from staticfiles %}si lo desea, pero este último es más explícito.

Mella
fuente
31
Django V1.10 ahora recomienda solo {% load static %}. "En versiones anteriores, tenías que usar {% load static from staticfiles %}en tu plantilla para entregar archivos desde el almacenamiento definido en STATICFILES_STORAGE. Esto ya no es necesario".
John C
1
Desde 2016 solo necesitamos usar {% load static %}.
Uri
5

No sé cuál se supone que es la diferencia, pero encontré una diferencia de caso de uso (usando django 1.9.1 ejecutándose a través de apache, wsgi en Python 3.4). En mi aplicación, tengo algunas imágenes ImageFieldsen la base de datos. Si uso un código como este en mi plantilla:

<a href="object-{{object.id}}"><img src="{% static object.image %}" height="200px"></a>

entonces, si lo uso {% load static %}, django lanza un TypeError( Cannot mix str and non-str arguments). Esto se debe presumiblemente a que object.imageno es una cadena, es una ImageField, que se convierte en una cadena en una etapa posterior. Sin embargo, si se utiliza {% load staticfiles %}no se produce tal error.

Desafortunadamente, descubrí esta diferencia después de pasar horas tratando de depurar el problema. Me las arreglé para encontrar una solución al usar la primera opción, es decir, agregar un método de conversión de cadenas al objeto de esta manera:

#image string
def image_str(self):
    return str(self.image)

Espero que este conocimiento sea de utilidad para alguien.

CoderGuy123
fuente
1

Consulte los documentos , donde hay una buena explicación. En realidad, la {% static %}etiqueta de la plantilla conoce la ubicación de STATICFILE_STORAGE

Como dicen los doctores:

 {% load static from staticfiles %} <img src="{% static "images/hi.jpg"
 %}" alt="Hi!" /> The previous example is equal to calling the url method of an instance of STATICFILES_STORAGE with "images/hi.jpg".

Esto es especialmente útil cuando se usa un backend de almacenamiento no local para implementar archivos como se documenta en Entrega de archivos estáticos desde un servicio en la nube o CDN.

Si desea recuperar una URL estática sin mostrarla, puede usar una llamada ligeramente diferente:

{% load static from staticfiles %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}" alt="Hi!" />

¡¡Espero que ayude!!

S.Ali
fuente
17
Todavía no sé cuando debo usar {% load static %}, {% load staticfiles %}, {{STATIC_URL}}... y sé que no sé cuál es la diferencia entre {% load static %}e{% load static from staticfiles %}
trikoder_beta
1
simplemente copiar un montón de líneas del documento no ayuda realmente
Hasan Iqbal
1

{% load staticfiles %} es muy útil cuando utiliza diferentes almacenamientos como S3, luego se convertirá en las URL de S3

Dilraj
fuente