อะไรคือความแตกต่างระหว่าง {% load staticfiles%} และ {% load static%}


94

ส่วนที่สำคัญที่สุดของคำถามอยู่ในหัวข้อ

ฉันสงสัยว่าแท็กใดดีที่สุดสำหรับกรณีใด ยิ่งไปกว่านั้น ... ฉันพบโค้ดที่ใช้settings.STATIC_URLรวมอยู่{{STATIC_URL}}ในเทมเพลตด้วย

ฉันสับสนเล็กน้อย


ฉันใช้ STATIC_URL สำหรับทุกอย่างและดูเหมือนว่าจะใช้ได้ดีสำหรับฉัน
Maximas

1
@ Maximas มันใช้งานได้ แต่ฉันคิดว่ามันไม่ใช่แนวทางปฏิบัติที่ดีที่สุด
KhoPhi

1
ไม่มีคำตอบใดที่ดี นี่คือคำตอบอื่น ๆ ที่ผ่านมาและสมบูรณ์
จรัส

คำตอบ:


60

staticแท็กเทมเพลตในตัว "ลิงก์ [s] ไปยังไฟล์แบบคงที่ที่บันทึกไว้ในSTATIC_ROOT"

staticfilesแอป contrib ของstaticแท็กแม่แบบ "ใช้กำหนดค่าSTATICFILES_STORAGEการจัดเก็บข้อมูลเพื่อสร้าง URL แบบเต็มสำหรับให้ทางญาติ" ซึ่งก็คือ "มีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อใช้แบ็กเอนด์การจัดเก็บไม่อยู่ในท้องถิ่นในการปรับใช้ไฟล์"

ในตัวstaticเอกสารแท็กเทมเพลต (เชื่อมโยงไปยังด้านบน) มีบันทึกที่บอกว่าจะใช้เป็นstaticfilesแอพพลิเค contrib ของstaticแท็กแม่ "ถ้าคุณมีกรณีการใช้งานขั้นสูงเช่นการใช้บริการคลาวด์ที่จะให้บริการไฟล์คงที่" และมันทำให้ตัวอย่างนี้ ทำเช่นนั้น:

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

คุณสามารถใช้ได้{% load staticfiles %}มากกว่า{% load static from staticfiles %}ถ้าต้องการ แต่อย่างหลังชัดเจนกว่า


32
Django V1.10แนะนำเพียง{% load static %}. "ในเวอร์ชันเก่าคุณต้องใช้{% load static from staticfiles %}ในเทมเพลตของคุณเพื่อให้บริการไฟล์จากที่เก็บข้อมูลที่กำหนดไว้ใน STATICFILES_STORAGE ซึ่งไม่จำเป็นอีกต่อไป"
John C

1
ตั้งแต่ปี 2016 เราจำเป็นต้องใช้{% load static %}เท่านั้น
Uri

5

ฉันไม่รู้ว่าควรจะแตกต่างกันอย่างไร แต่ฉันพบความแตกต่างของกรณีการใช้งาน (โดยใช้ django 1.9.1 ที่ทำงานผ่าน apache, wsgi บน Python 3.4) ในแอพของฉันฉันมีรูปภาพบางส่วนอยู่ImageFieldsในฐานข้อมูล หากฉันใช้รหัสเช่นนี้ในเทมเพลตของฉัน:

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

จากนั้นถ้าฉันใช้{% load static %}django จะพ่นTypeError( Cannot mix str and non-str arguments) น่าจะเป็นเพราะobject.imageไม่ใช่สตริง แต่เป็นสตริงImageFieldที่ถูกแปลงเป็นสตริงในขั้นตอนต่อไป อย่างไรก็ตามหากใครใช้ก็{% load staticfiles %}ไม่มีข้อผิดพลาดเกิดขึ้น

น่าเสียดายที่ฉันค้นพบความแตกต่างนี้หลังจากใช้เวลาหลายชั่วโมงในการพยายามแก้ไขปัญหา ฉันจัดการเพื่อหาวิธีแก้ปัญหาเมื่อใช้ตัวเลือกแรกคือการเพิ่มวิธีการแปลงสตริงให้กับวัตถุเช่นนี้:

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

หวังว่าความรู้นี้จะมีประโยชน์กับใครบางคน



1

อ้างถึงเอกสารซึ่งมีคำอธิบายที่ดี ที่จริงแล้ว{% static %}แท็กเทมเพลตรู้ตำแหน่งของSTATICFILE_STORAGE

ตามที่เอกสารกล่าวว่า:

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

สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อใช้แบ็กเอนด์ที่เก็บข้อมูลที่ไม่ใช่ในเครื่องเพื่อปรับใช้ไฟล์ตามที่ระบุไว้ในการให้บริการไฟล์แบบคงที่จากบริการคลาวด์หรือ CDN

หากคุณต้องการดึง URL แบบคงที่โดยไม่ต้องแสดงคุณสามารถใช้การเรียกที่แตกต่างกันเล็กน้อย:

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

หวังว่าจะช่วย !!


17
ผมก็ยังไม่ทราบว่าเมื่อฉันควรใช้{% load static %}, {% load staticfiles %}, {{STATIC_URL}}... และรู้ว่าผมไม่ทราบว่าสิ่งที่เป็นความแตกต่างระหว่าง{% load static %}และ{% load static from staticfiles %}
trikoder_beta

1
เพียงแค่คัดลอกบรรทัดจำนวนมากจากเอกสารไม่ได้ช่วยอะไรเลย
Hasan Iqbal

1

{% load staticfiles %} มีประโยชน์มากเมื่อคุณใช้พื้นที่เก็บข้อมูลต่างๆเช่น S3 จากนั้นจะแปลงเป็น S3 URL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.