Sự khác biệt giữa {% load staticfiles%} và {% load static%} là gì


93

Phần quan trọng nhất của câu hỏi nằm trong chủ đề.

Tôi đang tự hỏi thẻ nào là tốt nhất cho trường hợp nào. Hơn nữa ... Tôi tìm thấy mã, mà còn sử dụng settings.STATIC_URLbao gồm theo {{STATIC_URL}}trong mẫu.

Tôi hơi bối rối.


Tôi chỉ sử dụng STATIC_URL cho mọi thứ và nó dường như hoạt động tốt đối với tôi
Maximas

1
@Maximas Nó hoạt động, nhưng tôi đoán nó không phải là phương pháp hay nhất
KhoPhi

1
Không có câu trả lời nào trong số này là tốt. Đây là một câu trả lời gần đây và đầy đủ hơn .
Jarad

Câu trả lời:


60

Việc xây dựng trong staticmẫu thẻ "liên kết [s] để các tập tin tĩnh được lưu trong STATIC_ROOT".

Các staticfilesứng dụng contrib của staticmẫu thẻ "sử dụng cấu hình STATICFILES_STORAGElưu trữ để tạo URL đầy đủ cho các đường dẫn tương đối cho", mà là "đặc biệt hữu ích khi sử dụng một backend lưu trữ không địa phương để triển khai các file".

Việc xây dựng trong statictài liệu hướng dẫn mẫu thẻ của (liên quan đến ở trên) có một ghi chú cho biết để sử dụng các staticfilesứng dụng contrib của staticmẫu thẻ "nếu bạn có một trường hợp sử dụng tiên tiến như sử dụng một dịch vụ đám mây để phục vụ các tập tin tĩnh", và nó mang lại cho ví dụ này của làm như vậy:

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

Bạn có thể sử dụng {% load staticfiles %}thay vì {% load static from staticfiles %}nếu bạn muốn, nhưng cái sau rõ ràng hơn.


31
Django V1.10 hiện chỉ khuyến nghị {% load static %}. "Trong các phiên bản cũ hơn, bạn phải sử dụng {% load static from staticfiles %}trong mẫu của mình để cung cấp tệp từ bộ nhớ được xác định trong STATICFILES_STORAGE. Điều này không còn bắt buộc."
John C

1
Kể từ năm 2016 chúng ta chỉ cần sử dụng {% load static %}.
Uri

5

Tôi không biết sự khác biệt được cho là gì, nhưng tôi đã tìm thấy sự khác biệt về trường hợp sử dụng (sử dụng django 1.9.1 chạy qua apache, wsgi trên Python 3.4). Trong ứng dụng của tôi, tôi có một số hình ảnh trong ImageFieldscơ sở dữ liệu. Nếu tôi sử dụng mã như thế này trong mẫu của mình:

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

sau đó, nếu tôi sử dụng {% load static %}, django ném dấu TypeError( Cannot mix str and non-str arguments). Điều này có lẽ là do object.imagechuỗi không phải là một chuỗi, mà là một ImageField, được chuyển đổi thành chuỗi ở một số giai đoạn sau. Tuy nhiên, nếu ai sử dụng {% load staticfiles %}không xảy ra lỗi như vậy.

Thật không may, tôi đã phát hiện ra sự khác biệt này sau khi dành hàng giờ để khắc phục sự cố. Tôi đã cố gắng tìm ra cách giải quyết khi sử dụng tùy chọn đầu tiên, cụ thể là thêm phương thức chuyển đổi chuỗi vào đối tượng như sau:

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

Hy vọng kiến ​​thức này sẽ có ích cho ai đó.



1

Tham khảo các tài liệu , nơi có một lời giải thích hay về nó. Trên thực tế, {% static %}thẻ mẫu biết vị trí của STATICFILE_STORAGE

Như các tài liệu nói:

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

Điều này đặc biệt hữu ích khi sử dụng phần phụ trợ lưu trữ không cục bộ để triển khai tệp dưới dạng tài liệu trong Cung cấp tệp tĩnh từ dịch vụ đám mây hoặc CDN.

Nếu bạn muốn truy xuất một URL tĩnh mà không hiển thị nó, bạn có thể sử dụng một lệnh gọi hơi khác:

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

Hy vọng rằng sẽ giúp !!


17
Tôi vẫn không biết khi nào tôi nên sử dụng {% load static %}, {% load staticfiles %}, {{STATIC_URL}}... và biết tôi không biết sự khác biệt giữa những gì là {% load static %}{% load static from staticfiles %}
trikoder_beta

1
chỉ đơn giản là sao chép một loạt các dòng từ các tài liệu không thực sự giúp
Hasan Iqbal

1

{% load staticfiles %} rất hữu ích khi bạn đang sử dụng các kho lưu trữ khác nhau như S3, sau đó nó sẽ chuyển đổi thành các URL S3

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.