2014-06-16 21 views
50

La parte più importante della domanda è nell'argomento.Qual è la differenza tra {% load staticfiles%} e {% load static%}

Mi chiedo quale tag è meglio per quale caso. Inoltre ... ho trovato il codice, che usa anche settings.STATIC_URL incluso da {{STATIC_URL}} nei modelli.

Sono un po 'confuso.

+0

mi basta usare STATIC_URL per tutto e sembra funzionare bene per me – Maximas

+1

@Maximas funziona, ma Immagino che non sia la miglior pratica – Rexford

+0

Nessuna di queste risposte è buona. Questa è una [risposta più recente e completa] (https://stackoverflow.com/a/34424007/1577947). – Jarad

risposta

1

Fare riferimento a docs, dove è disponibile una buona spiegazione. In realtà il tag modello {% static %} conosce la posizione del STATICFILE_STORAGE

Come docs dicono:

{% 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". 

Ciò è particolarmente utile quando si utilizza un backend di memorizzazione non-locale per distribuire i file come documentato nel servire i file statici da un servizio cloud o CDN.

Se vuoi per recuperare un URL statico senza visualizzare, è possibile utilizzare una chiamata leggermente diversa:

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

Speranza che aiuta !!

+13

Ancora non so quando dovrei usare '{% load static%}', '{% load staticfiles%}', '{{STATIC_URL}}' ... e so che non so qual è la differenza tra '{% load static%}' e '{% load static da staticfiles%}' –

+0

semplicemente copiare un sacco di righe dal documento non aiuta molto –

41

The built-in static template tag "collegamento [s] a file statici che vengono salvati in STATIC_ROOT".

The staticfiles contrib app's static template tag "utilizza lo spazio di archiviazione configurato STATICFILES_STORAGE per creare l'URL completo per il percorso relativo specificato", che è "particolarmente utile quando si utilizza un back-end di archiviazione non locale per distribuire i file".

Il built-in di documentazione static del tag template (linkato sopra) ha una nota che dice di usare tag modello static dell'app staticfiles contrib "se si dispone di un caso d'uso avanzate come l'utilizzo di un servizio cloud per servire i file statici" , e dà questo esempio di farlo:

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

si potrebbe utilizzare {% load staticfiles %} piuttosto che {% load static from staticfiles %} se si vuole, ma il secondo è più esplicito.

+14

[Django V1.10] (https: //docs.djangoproject .com/it/1.10/ref/templates/builtins/# static) ora consiglia solo '{% load static%}'. "Nelle versioni precedenti, dovevi usare' {% load static from staticfiles%} 'nel tuo template per servire i file dalla memoria definita in STATICFILES_STORAGE. Questo non è più necessario." –

3

Non so quale sia la differenza, ma ho trovato una differenza tra maiuscole e minuscole (utilizzando django 1.9.1 in esecuzione tramite apache, wsgi su Python 3.4). Nella mia app, ho alcune immagini in ImageFields nel database. Se uso il codice come questo nel mio modello:

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

poi, se io uso {% load static %}, Django thorws un TypeError (Cannot mix str and non-str arguments). Questo è presumibilmente perché lo object.image non è una stringa, è un ImageField, che viene convertito in una stringa in una fase successiva. Tuttavia, se si utilizza {% load staticfiles %}, non si verifica tale errore.

Sfortunatamente, ho scoperto questa differenza dopo aver passato ore a cercare di eseguire il debug del problema.Sono riuscito a trovare una soluzione per quando si utilizza la prima opzione, vale a dire aggiungere un metodo di stringa-convertitore per l'oggetto come questo:

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

Speranza questa conoscenza sarà utile a qualcuno.

1

{% load staticfiles %} è molto utile quando si utilizzano diversi depositi come S3, allora sarà convertire in URL S3

Problemi correlati