django 1.5 - วิธีใช้ตัวแปรภายในแท็กแบบคงที่


106

ฉันกำลังย้ายข้อมูลการอ้างอิงไฟล์แบบคงที่ทั้งหมดในโปรเจ็กต์ของฉันไปยังแท็ก {% static%} ใหม่ที่แนะนำ django 1.5 แต่ฉันมีปัญหาในบางที่ฉันใช้ตัวแปรเพื่อรับเนื้อหา ด้วยแท็กใหม่ฉันทำไม่ได้มีวิธีแก้ปัญหานี้ไหม

รหัสปัจจุบัน:

<img src="{{ STATIC_URL }}/assets/flags/{{ request.LANGUAGE_CODE }}.gif" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" />

ควรเป็นอย่างไร (ไม่ได้ผล):

<img src="{% static 'assets/flags/{{ request.LANGUAGE_CODE }}.gif' %}" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" />

คำตอบ:


150

คุณควรจะสามารถเชื่อมสตริงกับaddตัวกรองเทมเพลต :

{% with 'assets/flags/'|add:request.LANGUAGE_CODE|add:'.gif' as image_static %}
  {% static image_static %}
{% endwith %}

สิ่งที่คุณพยายามทำใช้ไม่ได้กับstaticแท็กเทมเพลตเนื่องจากใช้สตริงหรือตัวแปรเท่านั้น:

{% static "myapp/css/base.css" %}
{% static variable_with_path %}
{% static "myapp/css/base.css" as admin_base_css %}
{% static variable_with_path as varname %}

24

วิธีที่สะอาดกว่าคือการตั้งค่า {% static%} เป็นตัวแปรจากจุดเริ่มต้นของ html เพื่อให้เราสามารถใช้งานได้ในแบบที่เราต้องการ

{% load static %}
{% static "" as baseUrl %}
<img src="{{ baseUrl }}/img/{{p.id}}"></img>

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

2
สิ่งนี้ดูดีมากในเทมเพลต แต่นี่เป็นการแฮ็กมากกว่าวิธีที่สะอาดในการใช้แบบคงที่
Mikael Lindlöf

23

สำหรับสิ่งที่คุ้มค่าฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุด:

<img src="{% static 'assets/flags/'|add:request.LANGUAGE_CODE|add:'.gif' %}" ... >

นี่เป็นคำถามเก่าและฉันไม่แน่ใจว่าวิธีนี้สามารถทำได้ในตอนนั้นหรือไม่ แต่ตอนนี้ใน Django 2.0 ดูเหมือนว่าจะใช้ได้ดีสำหรับฉัน


4
ฉันยืนยันว่าวิธีนี้ใช้ได้กับ Django 2.0 และในความคิดของฉันมันเป็นวิธีที่ดีที่สุดในการแก้ปัญหา
Orangft

ใช้ได้ผลสำหรับฉัน แต่เอกสารมาพร้อมกับคำเตือนนี้: "สตริงที่สามารถบีบบังคับให้เป็นจำนวนเต็มจะถูกรวมเข้าด้วยกันไม่รวมกัน"
run_the_race

ไม่ทำงานกับชื่อไฟล์ที่แฮช (ManifestStaticfilesStorage)
run_the_race

@run_the_race ที่เกี่ยวข้องจริงๆ แต่เนื่องจากเรารู้ว่าอาร์กิวเมนต์แรกไม่สามารถเป็นจำนวนเต็มได้ในกรณีนี้จึงควรปลอดภัย นอกจากนี้ชื่อไฟล์ที่แฮชมีการกำหนด " str " หรือ " add " หรือไม่
aliqandil

17

ฉันทำให้สิ่งนี้ทำงานได้โดยใช้สตริงว่างสำหรับเส้นทางคงที่จากนั้นใช้ตัวแปรของฉันในส่วนของตัวเองดังนี้:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>

1
นี่เป็นเรื่องที่ฉลาดมาก แต่สิ่งที่ @horbor พูดคุณสามารถทำให้มันง่ายขึ้น! docs.djangoproject.com/th/1.6/ref/templates/builtins/…
daviddeath

2
{% get_static_prefix %}แทนที่จะใช้สตริงว่างการใช้งาน
Martijn Pieters

13

@rounin อย่างน้อยก็ใช้ได้

{% get_static_prefix %} 

ซึ่งจะโหลดเมื่อคุณ {% load static%} เป็นธรรมชาติมากขึ้นแล้ว {% static ''%} :)


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