Najważniejsza część pytania dotyczy tematu.
Zastanawiam się, jaki tag jest najlepszy w jakim przypadku. Ponadto ... znalazłem kod, który również wykorzystuję settings.STATIC_URL
zawarty {{STATIC_URL}}
w szablonach.
Jestem trochę zmieszany.
Najważniejsza część pytania dotyczy tematu.
Zastanawiam się, jaki tag jest najlepszy w jakim przypadku. Ponadto ... znalazłem kod, który również wykorzystuję settings.STATIC_URL
zawarty {{STATIC_URL}}
w szablonach.
Jestem trochę zmieszany.
Odpowiedzi:
Wbudowany static
znacznik szablonu „łączy [i] z plikami statycznymi, które są zapisywane w STATIC_ROOT
”.
W staticfiles
contrib aplikacji w static
szablon tag „używa skonfigurowanej STATICFILES_STORAGE
pamięci masowej, aby utworzyć pełny adres URL dla danej ścieżki względnej”, który jest „szczególnie przydatna przy użyciu non-local backendu przechowywania wdrożyć pliki”.
Dokumentacja wbudowanego static
tagu szablonu (do której link znajduje się powyżej) zawiera uwagę, która mówi, że należy użyć tagu szablonu staticfiles
aplikacji Contrib static
„jeśli masz zaawansowany przypadek użycia, taki jak korzystanie z usługi w chmurze do obsługi plików statycznych”, i podaje ten przykład robiąc tak:
{% load static from staticfiles %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />
Możesz użyć {% load staticfiles %}
raczej niż {% load static from staticfiles %}
jeśli chcesz, ale to drugie jest bardziej wyraźne.
{% load static %}
. „W starszych wersjach trzeba było używać {% load static from staticfiles %}
w szablonie do udostępniania plików z magazynu zdefiniowanego w STATICFILES_STORAGE. Nie jest to już wymagane”.
{% load static %}
.
Nie wiem, jaka powinna być różnica, ale znalazłem różnicę w przypadku użycia (używając django 1.9.1 działającego przez apache, wsgi w Pythonie 3.4). W mojej aplikacji mam kilka obrazów w ImageFields
bazie danych. Jeśli używam takiego kodu w moim szablonie:
<a href="object-{{object.id}}"><img src="{% static object.image %}" height="200px"></a>
wtedy, jeśli używam {% load static %}
, django rzuca a TypeError
( Cannot mix str and non-str arguments
). Dzieje się tak prawdopodobnie dlatego, że object.image
nie jest to ciąg, to jest ImageField
, który jest konwertowany na łańcuch w późniejszym etapie. Jeśli jednak używa się{% load staticfiles %}
taki błąd nie występuje.
Niestety odkryłem tę różnicę po spędzeniu godzin na próbach debugowania problemu. Udało mi się znaleźć obejście podczas korzystania z pierwszej opcji, a mianowicie dodać metodę konwertera ciągów do obiektu w następujący sposób:
#image string
def image_str(self):
return str(self.image)
Mam nadzieję, że ta wiedza komuś się przyda.
Dokumentacja Django preferuje teraz {% load static %}
.
{% load staticfiles %}
działa, ale myślę, że jest przestarzały.
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#static
Zapoznaj się z dokumentacją , w której znajduje się ładne wyjaśnienie. Właściwie {% static %}
tag szablonu zna lokalizację STATICFILE_STORAGE
Jak mówią doktorzy:
{% 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".
Jest to szczególnie przydatne w przypadku korzystania z nielokalnej pamięci masowej do wdrażania plików zgodnie z dokumentacją w sekcji Udostępnianie plików statycznych z usługi w chmurze lub CDN.
Jeśli chcesz pobrać statyczny adres URL bez jego wyświetlania, możesz użyć nieco innego wywołania:
{% load static from staticfiles %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}" alt="Hi!" />
Mam nadzieję, że to pomoże!
{% load static %}
, {% load staticfiles %}
, {{STATIC_URL}}
... i wiem, że nie wiem, jaka jest różnica między {% load static %}
i{% load static from staticfiles %}