2016-04-13 21 views
6

Trong một dự án Django, tôi muốn bao gồm một tệp tĩnh trong một mẫu. Sau đây là cấu trúc dự án:django: cách bao gồm tệp tĩnh trong mẫu?

proj/ 
    main/ 
     static/ 
     main/ 
      js/ 
       main.js 
    news/ 
     templates/ 
     news/ 
      news.html 

Trong news.html, tôi muốn bao gồm các main.js với dạng giả thuyết sau:

{% load staticfiles %} 
... 

{% include {% static 'main/js/main.js' %} %} 

Làm thế nào để làm điều đó?

+0

Tại sao bỏ phiếu xuống? Và được đề xuất đóng câu hỏi vì nó quá ** rộng? Thật điên rồ!Câu hỏi này rất cụ thể: làm cách nào để tích hợp hai thẻ mẫu 'include' và' static' sao cho tôi có thể bao gồm một tệp tĩnh? –

+0

[Cần hiển thị nỗ lực?] (Http://meta.stackoverflow.com/q/288176/1324033) -> "" Đơn đặt hàng công việc "... phải được gắn cờ là" quá rộng "." – Sayse

+1

Bao gồm một tập tin tĩnh trong mẫu của bạn không phải là một điều rất phổ biến để làm; bạn có chắc đó thực sự là giải pháp đúng cho bất kỳ vấn đề nào bạn đang cố giải quyết không? Có nhiều cách giải quyết khác, chẳng hạn như bao gồm STATIC_ROOT của bạn trong TEMPLATE_DIRS hoặc thậm chí là viết trình tải mẫu của riêng bạn cho các tệp tĩnh, nhưng đó là một điều kỳ lạ để thực hiện và nó có thể trở lại để cắn bạn trong ass sau này. – koniiiik

Trả lời

1

Tôi có một vài ý tưởng.

Điều dễ nhất cần làm là đảm bảo bạn đã bật số filesystem loader và bạn bao gồm thư mục có chứa tệp tĩnh có liên quan trong TEMPLATES[0]['DIRS'] (trước đây là TEMPLATE_DIRS). Hãy cẩn thận là nó sẽ không tự động nhận các tệp tĩnh chứa bên trong các ứng dụng được cài đặt của bạn, trừ khi bạn liệt kê chúng trong DIRS. Một tùy chọn khác sẽ là sử dụng STATIC_ROOT, nhưng điều đó sẽ chỉ hoạt động nếu bạn chạy collectstatic mỗi khi bạn thay đổi tệp tĩnh mà bạn thường không phải thực hiện trong quá trình phát triển. Một lỗ hổng khác là nó sẽ chỉ làm việc với bộ nhớ tĩnh cục bộ, không phải nếu bạn sử dụng bất kỳ CDN nào hoặc lưu trữ các tệp tĩnh của bạn trên một máy chủ/mạng/bất kỳ thứ gì khác.

Điều khác bạn có thể làm là viết trình tải mẫu của riêng bạn sẽ sử dụng API tệp tĩnh để tải thống kê dưới dạng mẫu. Điều này có liên quan nhiều hơn một chút, nhưng nó sẽ có thể truy cập các tệp tĩnh bất kể chúng được lưu trữ và phục vụ như thế nào.

Nếu bạn chọn một trong hai tùy chọn, bạn vẫn phải cẩn thận. Ví dụ, bạn sẽ phải đảm bảo rằng các tệp tĩnh mà bạn đang bao gồm dưới dạng các mẫu được an toàn để đưa vào HTML hoặc bất kỳ ngữ cảnh nào khác mà bạn đang sử dụng chúng. Sẽ không có thoát.

Trong trường hợp bạn đang cố gắng tối ưu hóa số lượng yêu cầu khách hàng phải thực hiện, có những cách tốt hơn. Bạn có nhiều khả năng thực hiện tốt hơn một số đường dẫn sẽ xử lý trước và rút gọn các tệp tĩnh của bạn. Bao gồm bất kỳ đoạn mã CSS/JS quan trọng nào vào HTML sẽ khiến khách hàng không thể tận dụng bộ nhớ đệm, buộc họ tải xuống lại cùng một nội dung tĩnh nhiều lần, có khả năng tác động tiêu cực đến hiệu suất.

Chỉnh sửa: Vì bạn muốn chỉ bao gồm một số biến JavaScript động, đó không phải là tệp tĩnh. Điều bạn thực sự muốn là tạo một mẫu chứa mã JavaScript và không gây rối với việc xử lý các tệp tĩnh dưới dạng mẫu. Không có quy tắc nào có thể nói mọi javascript cần phải là một tệp tĩnh. Nếu nó là động, nó không phải là một tập tin tĩnh.

Để lưu nội dung, đây là trường hợp điển hình của XY problem. Vấn đề X đã được gán động các giá trị cho các biến JavaScript khi rendering các khuôn mẫu. Bạn đã đưa ra các tệp tĩnh trong các mẫu dưới dạng một giải pháp tiềm năng, nhưng sau đó gặp vấn đề với Y, đó là bạn không biết cách bao gồm các tệp tĩnh trong các mẫu.

+0

Giải thích hay. Thẳng đến điểm. –

3

include chỉ tìm kiếm tệp chỉ trong thư mục mẫu. Những gì bạn có thể làm (mặc dù tôi sẽ không) là thay đổi cài đặt của bạn để bao gồm các tệp tĩnh:

TEMPLATE_DIRS = [ 
    ... 
    "path/to/your/statics", 
] 
Các vấn đề liên quan