Hướng dẫn django pass variable to javascript file - django chuyển biến vào tệp javascript

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

2022-10-06 Bạn muốn chuyển dữ liệu của mình từ chế độ xem Django của bạn sang JavaScript, trong mẫu của bạn. Và, bạn muốn làm điều đó một cách an toàn, không có nguy cơ vô tình cho phép tiêm mã độc. Tuyệt vời, đây là bài viết cho bạn!

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
  • 
       var my_var = '{{ python_object|escapejs }}';
    
    
    8 cho các giá trị phức tạp

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
}
1

Mộ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
}
2

Sau đó, HTML sẽ là:

my_cool_js_function[some_param]{
    // do some cool stuff
}
3

Mã 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
}
4

import 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
}
6

Simples!

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
}
7

Bạ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
}
8

HTML 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
}
9

Bạ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}}]
0

Right-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}}]
1

Như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

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}}]
2

Bạ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}}]
3

Django sẽ hiển thị thẻ

{{ mydata|json_script:"mydata" }}
0 chứa dữ liệu:

// some html code

my_cool_js_function[{{param}}]
4

Kị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}}]
5

Sweet.

Django

Bài Viết Liên Quan

Chủ Đề