Was ist der Unterschied zwischen {% load staticfiles%} und {% load static%}?

92

Der wichtigste Teil der Frage ist das Thema.

Ich frage mich, welches Tag für welchen Fall am besten geeignet ist. Außerdem ... Ich fand Code, dass auch die Verwendung settings.STATIC_URLvon eingeschlossen {{STATIC_URL}}in den Vorlagen.

Ich bin ein bisschen verwirrt.

trikoder_beta
quelle
Ich benutze nur STATIC_URL für alles und es scheint gut für mich zu funktionieren
Maximas
1
@ Maximas Es funktioniert, aber ich denke, es ist nicht die beste Vorgehensweise
KhoPhi
1
Keine dieser Antworten ist gut. Dies ist eine neuere und vollständigere Antwort .
Jarad

Antworten:

60

Das integrierte staticVorlagen-Tag "Link [s] zu statischen Dateien, in denen gespeichert wird STATIC_ROOT".

Das Template-Tag der staticfilesContrib-Appstatic "verwendet den konfigurierten STATICFILES_STORAGESpeicher, um die vollständige URL für den angegebenen relativen Pfad zu erstellen". Dies ist "besonders nützlich, wenn Sie ein nicht lokales Speicher-Backend zum Bereitstellen von Dateien verwenden".

In staticder Dokumentation des integrierten Vorlagen-Tags (oben verlinkt) ist ein Hinweis enthalten, der besagt, dass das Vorlagen-Tag der staticfilesContrib-App verwendet werden soll, static"wenn Sie einen erweiterten Anwendungsfall haben, z. B. die Verwendung eines Cloud-Dienstes zum Bereitstellen statischer Dateien", und dieses Beispiel enthält dabei:

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

Sie könnten {% load staticfiles %}eher verwenden als {% load static from staticfiles %}wenn Sie möchten, aber letzteres ist expliziter.

Nick
quelle
30
Django V1.10 empfiehlt jetzt nur {% load static %}. "In älteren Versionen mussten Sie {% load static from staticfiles %}in Ihrer Vorlage Dateien aus dem in STATICFILES_STORAGE definierten Speicher bereitstellen. Dies ist nicht mehr erforderlich."
John C
1
Seit 2016 brauchen wir nur noch zu verwenden {% load static %}.
Speedy Match
5

Ich weiß nicht, was der Unterschied sein soll, aber ich habe einen Anwendungsfallunterschied gefunden (mit django 1.9.1, das über Apache ausgeführt wird, wsgi unter Python 3.4). In meiner App befinden sich einige Bilder ImageFieldsin der Datenbank. Wenn ich in meiner Vorlage folgenden Code verwende:

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

dann, wenn ich benutze {% load static %}, wirft django ein TypeError( Cannot mix str and non-str arguments). Dies liegt vermutlich daran , dass object.imagees sich nicht um eine Zeichenfolge handelt, sondern um eine Zeichenfolge, die ImageFieldzu einem späteren Zeitpunkt in eine Zeichenfolge konvertiert wird. Wenn man jedoch {% load staticfiles %}keinen solchen Fehler verwendet, tritt er auf.

Leider habe ich diesen Unterschied entdeckt, nachdem ich stundenlang versucht hatte, das Problem zu beheben. Ich habe es geschafft, eine Problemumgehung zu finden, wenn ich die erste Option verwendet habe, nämlich dem Objekt eine String-Konverter-Methode wie folgt hinzuzufügen:

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

Hoffe, dieses Wissen wird jemandem von Nutzen sein.

CoderGuy123
quelle
1

Lesen Sie die Dokumente , in denen es eine schöne Erklärung dafür gibt. Tatsächlich {% static %}kennt das Template-Tag den Speicherort von STATICFILE_STORAGE

Wie die Dokumente sagen:

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

Dies ist besonders nützlich, wenn Sie ein nicht lokales Speicher-Backend verwenden, um Dateien bereitzustellen, wie unter Bereitstellen statischer Dateien von einem Cloud-Dienst oder CDN dokumentiert.

Wenn Sie eine statische URL abrufen möchten, ohne sie anzuzeigen, können Sie einen etwas anderen Aufruf verwenden:

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

Hoffentlich hilft das!!

S.Ali
quelle
17
Ich weiß immer noch nicht, wann ich verwenden {% load static %}soll {% load staticfiles %}, {{STATIC_URL}}... und weiß, dass ich nicht weiß, was der Unterschied zwischen {% load static %}und{% load static from staticfiles %}
trikoder_beta
1
Das einfache Kopieren einiger Zeilen aus dem Dokument hilft nicht wirklich
Hasan Iqbal
1

{% load staticfiles %} ist sehr hilfreich, wenn Sie verschiedene Speicher wie S3 verwenden, dann wird es in die S3-URLs konvertiert

Dilraj
quelle