Câu hỏi này phải rõ ràng nhưng tôi không thể tìm ra nó.
Trong một mẫu, tôi liên kết đến một tệp JS trong thư mục phương tiện của mình. Từ tệp đó, tôi muốn truy cập một biến ngữ cảnh như
var my_var = '{{ python_object|escapejs }}';
6.Nhưng cú pháp có khác nhau không ?? Cảm ơn bạn!!
Shaedrich
5.2612 Huy hiệu vàng27 Huy hiệu bạc39 Huy hiệu Đồng2 gold badges27 silver badges39 bronze badges
Hỏi ngày 30 tháng 12 năm 2011 lúc 20:45Dec 30, 2011 at 20:45
1
Ngoài câu trả lời của Andrzej Bobak, bạn cũng có thể tạo một biến toàn cầu trong JavaScript từ mẫu của mình. Ví dụ: mẫu của bạn có thể tạo mã như thế này:
var my_chart = {{ the_chart }};
Kịch bản của bạn sau đó có thể tham khảo
var my_var = '{{ python_object|escapejs }}';
7.Đã trả lời ngày 31 tháng 12 năm 2011 lúc 2:23Dec 31, 2011 at 2:23
Brian Nealbrian NealBrian Neal
31.3K7 Huy hiệu vàng54 Huy hiệu bạc59 Huy hiệu đồng7 gold badges54 silver badges59 bronze badges
5
Tôi không nghĩ rằng nó có thể theo cách này. Nếu bạn muốn truy cập một số dữ liệu được cung cấp bởi chế độ xem, bạn phải chuyển nó cho chức năng JS.
Thí dụ
Tệp JS:
my_cool_js_function[some_param]{
// do some cool stuff
}
lượt xem
// some html code
my_cool_js_function[{{param}}]
hi vọng điêu nay co ich :]
Đã trả lời ngày 30 tháng 12 năm 2011 lúc 20:57Dec 30, 2011 at 20:57
Andrzej Bobakandrzej BobakAndrzej Bobak
2.1163 huy hiệu vàng30 huy hiệu bạc36 Huy hiệu đồng3 gold badges30 silver badges36 bronze badges
1
Tôi cũng sẽ thêm vì tôi đã gặp lỗi một vài lần rằng nếu biến Python là một đối tượng, nó sẽ ném lỗi cú pháp trừ khi bạn đặt nó vào báo giá, nói cách khác, trong mẫu của bạn,
var my_var = '{{ python_object|escapejs }}';
Hơn nữa, trước khi đặt đối tượng đó vào ngữ cảnh, tốt nhất là trước tiên nên tuần tự hóa nó thành JSON, hoặc cuối cùng bạn sẽ phải thực hiện phân tích cú pháp chuỗi. Tôi cũng thấy rằng các đối tượng ngày cần phải được chuyển đổi thành chuỗi trước bước này.
import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
Và cuối cùng, trong JS, sau đó bạn có thể lặp lại thông qua đối tượng và sử dụng các giá trị như bạn có thể có trong Python bằng cách làm:
var my_var_parsed = jQuery.parseJSON[my_var];
Đã trả lời ngày 7 tháng 4 năm 2016 lúc 22:44Apr 7, 2016 at 22:44
Mastachimpmastachimpmastachimp
4183 Huy hiệu bạc14 Huy hiệu Đồng3 silver badges14 bronze badges
Hiện tại có một cách an toàn hơn để chuyển ngữ cảnh sang tệp JavaScript bằng cách sử dụng thẻ mẫu tích hợp
var my_var = '{{ python_object|escapejs }}';
8 với một đối số sẽ là ID được đặt cho phần tử được tạo.Trường hợp sử dụng sẽ là:
{{ mydata|json_script:"mydata" }}
Sau đó liên kết tệp JavaScript của bạn:
Thẻ tập lệnh sẽ phải đến sau thẻ mẫu mà tôi đoán là
Sau đó có thể được truy cập trong tệp JavaScript của bạn như:
const mydata = JSON.parse[document.getElementById['mydata'].textContent];
Nguồn
Django 3.1 Docs json_script
Một nguồn khác với lời giải thích thích hợp
Đã trả lời ngày 12 tháng 1 năm 2021 lúc 14:31Jan 12, 2021 at 14:31
name-andyname-andyname-andy
Huy hiệu vàng 40311 gold badge5 silver badges12 bronze badges
You want to pass your data from your Django view to JavaScript, in your template. And, you want to do it securely, with no risk of accidentally allowing malicious code injection. Great, this is the post for you!
Chúng tôi sẽ xem xét các vấn đề với JavaScript tạo khuôn mẫu, sau đó là hai kỹ thuật:
- Thuộc tính dữ liệu cho các giá trị đơn giản
8 cho các giá trị phức tạpvar my_var = '{{ python_object|escapejs }}';
Và cuối cùng, một số lựa chọn khác mà tôi không đề xuất.
Đi nào!
CẬP NHẬT [2022-10-21] Kênh YouTube Bugbytes có video dựa trên bài đăng này, thể hiện hai kỹ thuật được phê duyệt. The BugBytes Youtube channel has a video based on this post, demonstrating the two approved techniques.
Templating javascript don don làm việc
Nhiều nhà phát triển thử trực tiếp các thẻ nội tuyến
import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
0:{# DON’T DO THIS #} const username = "{{ username }}";
Tôi khuyên bạn không bao giờ làm điều này!never do this!
Điều này nói chung không hoạt động, vì Django thực hiện HTML-ESCAPING trên giá trị. Ví dụ: nếu
import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
1 là import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
2, đầu ra sẽ là:my_cool_js_function[some_param]{
// do some cool stuff
}
0Điều này có nghĩa là hiển thị tên người dùng không chính xác.
Ngoài ra, nó cực kỳ nguy hiểm nếu bạn mẫu các biến không chuỗi hoặc sử dụng các mẫu JavaScript [các chuỗi F F sử dụng BackTicks]. Ví dụ: lấy mẫu này:
my_cool_js_function[some_param]{
// do some cool stuff
}
1Một giá trị độc hại có thể sử dụng backtick để kết thúc theo nghĩa đen, sau đó thêm JavaScript tùy ý. Ví dụ: nếu
import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
1 là:my_cool_js_function[some_param]{
// do some cool stuff
}
2Sau đó, HTML sẽ là:
my_cool_js_function[some_param]{
// do some cool stuff
}
3Mã này xác định
import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
4, sau đó chèn import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
0 vào DOM có nguồn gốc từ import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
6. Kịch bản đó có thể đánh cắp tất cả dữ liệu người dùng. Panik !!!Panik!!!Hệ thống mẫu Django chỉ thoát HTML. Nó không được thiết kế để thoát các giá trị bên trong JavaScript, có cú pháp rộng hơn.
Trong khi khuôn mẫu JavaScript hoạt động trong các tình huống hạn chế, vì nó không an toàn, tôi khuyên bạn nên không bao giờ làm điều đó. Nó rất khó để duy trì các biến betwee tách biệt luôn chứa các ký tự an toàn và những biến số mà don. Ngoài ra, chỉ có một số thẻ và bộ lọc nhất định là an toàn. Trong thời gian, cuối cùng bạn sẽ giới thiệu các lỗ hổng bảo mật.never do it. It’s too hard to maintain a separation betwee variables that always contain safe characters, and those which don’t. Also, only certain tags and filters are safe. In time, you’ll eventually introduce security holes.
Thay vào đó, sử dụng một trong hai kỹ thuật sau đây.
Sử dụng các thuộc tính dữ liệu cho các giá trị đơn giản
Để chuyển các giá trị đơn giản cho JavaScript của bạn, nó rất thuận tiện khi sử dụng các thuộc tính dữ liệu:
my_cool_js_function[some_param]{
// do some cool stuff
}
4import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
7 cung cấp quyền truy cập nhanh vào phần tử import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
0 hiện tại. Thuộc tính import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
9 của nó chứa các thuộc tính được truyền dưới dạng chuỗi.Các tập tin tập lệnh riêng biệt
Bạn cũng có thể sử dụng
import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
7 cho các tệp tập lệnh riêng biệt:my_cool_js_function[some_param]{
// do some cool stuff
}
5… Đọc giống nhau:
my_cool_js_function[some_param]{
// do some cool stuff
}
6Simples!
Tôi khuyên bạn nên sử dụng các tệp tập lệnh riêng biệt càng nhiều càng tốt. Họ tốt hơn cho hiệu suất vì trình duyệt có thể lưu trữ mã. Ngoài ra, bạn có thể thiết lập Chính sách bảo mật nội dung [CSP] để không cho phép các thẻ tập lệnh nội tuyến, điều này ngăn chặn XSS Attacks, xem bài đăng tiêu đề bảo mật của tôi.]
Chuyển đổi trường hợp
Tài sản
import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
9 chuyển đổi trường hợp kebab thành Camelcase. Ví dụ: nếu bạn có var my_var_parsed = jQuery.parseJSON[my_var];
2:my_cool_js_function[some_param]{
// do some cool stuff
}
7Bạn có thể đọc nó trong JavaScript là
var my_var_parsed = jQuery.parseJSON[my_var];
3:my_cool_js_function[some_param]{
// do some cool stuff
}
8HTML kebab trở thành lạc đà javascript.
Các loại không chuỗi
import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
9 chỉ chứa các chuỗi, vì tất cả các giá trị thuộc tính HTML là chuỗi. Nếu bạn đang chuyển một số, ngày hoặc loại đơn giản khác cho JavaScript của bạn, bạn sẽ cần phải phân tích nó. Ví dụ, hãy tưởng tượng bạn đã vượt qua một số nguyên:my_cool_js_function[some_param]{
// do some cool stuff
}
9Bạn có thể muốn
var my_var_parsed = jQuery.parseJSON[my_var];
5 chuyển đổi giá trị này từ một chuỗi:// some html code
my_cool_js_function[{{param}}]
0Right-o.
Không có giới hạn
A
import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
0 có thể có nhiều thuộc tính dữ liệu như bạn muốn:
// some html code
my_cool_js_function[{{param}}]
1Nhưng đến một lúc nào đó, điều này có thể cảm thấy khá khó sử dụng. Ngoài ra, nó không thuận tiện để vượt qua các loại phức tạp như dicts hoặc danh sách trong các thuộc tính. Điều đó dẫn chúng ta đến cửa số hai!
Sử dụng
var my_var = '{{ python_object|escapejs }}';
8 cho các giá trị phức tạp
var my_var = '{{ python_object|escapejs }}';
Nếu bạn cần chuyển một dict hoặc danh sách cho JavaScript, hãy sử dụng bộ lọc Django từ ____38. Ví dụ, hãy tưởng tượng quan điểm của bạn đã vượt qua biến này trong bối cảnh:
// some html code
my_cool_js_function[{{param}}]
2Bạn có thể chuyển biến này cho bộ lọc
var my_var = '{{ python_object|escapejs }}';
8 như vậy:// some html code
my_cool_js_function[{{param}}]
3Django sẽ hiển thị thẻ
{{ mydata|json_script:"mydata" }}
0 chứa dữ liệu:// some html code
my_cool_js_function[{{param}}]
4Kịch bản sau đó có thể tìm dữ liệu
import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
0 làm phần tử tiếp theo sau import jsonpickle
context['python_object'] = jsonpickle.encode[python_object]
7 bằng cách sử dụng {{ mydata|json_script:"mydata" }}
3 và phân tích dữ liệu với {{ mydata|json_script:"mydata" }}
4:// some html code
my_cool_js_function[{{param}}]
5Sweet.