django 1.5 - Cách sử dụng các biến bên trong thẻ tĩnh


105

Tôi hiện đang di chuyển tất cả các tham chiếu tệp tĩnh trong dự án của mình sang thẻ {% static%} mới mà django 1.5 đã giới thiệu, nhưng tôi đang gặp sự cố, ở một số nơi tôi sử dụng các biến để lấy nội dung. Với thẻ mới tôi không thể, có cách nào để giải quyết điều này không?

Mã hiện tại:

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

Nó phải là gì (điều này không hoạt động):

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

Câu trả lời:


149

Bạn có thể nối các chuỗi với addbộ lọc mẫu :

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

Những gì bạn đang cố gắng thực hiện không hoạt động với staticthẻ mẫu vì nó chỉ cần một chuỗi hoặc một biến:

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

một cách rõ ràng hơn là đặt {% static%} làm một biến từ đầu html để chúng tôi có thể sử dụng nó theo bất kỳ cách nào chúng tôi muốn.

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

3
Điều này không thành công nếu bạn đang sử dụng bộ nhớ s3 với các URL đã ký, dưới dạng phụ trợ Bộ nhớ nếu không được gọi để chuẩn bị URL cho mỗi tệp.
shuckc

2
Điều này trông rất đẹp trong một mẫu nhưng đây là một vụ hack hơn là một cách sử dụng tĩnh sạch sẽ.
Mikael Lindlöf

23

Đối với những gì nó đáng giá, tôi nghĩ đây là cách dễ nhất:

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

Đây là câu hỏi cũ và tôi không chắc liệu phương pháp này có thể được thực hiện vào thời điểm đó hay không, Nhưng bây giờ, trong Django 2.0, điều này dường như hoạt động tốt với tôi.


4
Tôi xác nhận rằng phương pháp này hoạt động trong Django 2.0 và theo ý kiến ​​của tôi, đó là cách tốt nhất để giải quyết vấn đề.
Orangft

Công trình đối với tôi, nhưng các tài liệu đi kèm với cảnh báo này: "Strings có thể bị cưỡng chế số nguyên sẽ được tóm tắt, không nối"
run_the_race

Không hoạt động với tên tệp được băm (ManifestStaticfilesStorage).
run_the_race

@run_the_race thực sự liên quan. nhưng vì chúng ta biết đối số đầu tiên không thể là một số nguyên, trong trường hợp này, nó sẽ an toàn. Ngoài ra, tên tệp được băm có định nghĩa " str " hoặc " add " không?
aliqandil

17

Tôi làm cho điều này hoạt động bằng cách sử dụng một chuỗi trống cho đường dẫn tĩnh và sau đó sử dụng các biến của tôi trong phần riêng của chúng, như sau:

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

1
điều này thật siêu thông minh, nhưng những gì @horbor đã nói, bạn có thể đơn giản hóa nó hơn nữa! docs.djangoproject.com/en/1.6/ref/templates/builtins/...
daviddeath

2
Thay vì sử dụng một chuỗi rỗng, hãy sử dụng {% get_static_prefix %}.
Martijn Pieters

13

@rounin, ít nhất bạn có thể sử dụng

{% get_static_prefix %} 

sẽ được tải khi bạn {% load static%}. Nó tự nhiên hơn rồi {% static ''%} :)


Điều này sẽ không hoạt động với những thứ như ManifestStaticfilesStorage thay đổi foo.jsthànhfoo.8c9a23d.js
Kos
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.