জ্যাঙ্গো টেম্পলেট ভেরিয়েবল এবং জাভাস্ক্রিপ্ট


219

আমি যখন জ্যাঙ্গো টেমপ্লেট রেন্ডারার ব্যবহার করে কোনও পৃষ্ঠা রেন্ডার করি তখন আমি একটি অভিধান ভেরিয়েবলের মাধ্যমে বিভিন্ন পৃষ্ঠাতে ব্যবহার করে পৃষ্ঠাটিতে হেরফের করতে পারি can {{ myVar }}

জাভাস্ক্রিপ্টে একই ভেরিয়েবল অ্যাক্সেস করার কোনও উপায় আছে (সম্ভবত DOM ব্যবহার করে, আমি জানি না কীভাবে জ্যাঙ্গো ভেরিয়েবলগুলি অ্যাক্সেসযোগ্য করে তোলে)? আমি ভেরিয়েবলগুলিতে থাকা মানগুলির উপর ভিত্তি করে একটি এজেএক্স লুকআপ ব্যবহার করে বিশদটি সন্ধান করতে সক্ষম হতে চাই।

উত্তর:


291

{{variable}}সরাসরি HTML- এ প্রতিস্থাপিত করা হয়। একটি দেখার উত্স করুন; এটি কোনও "পরিবর্তনশীল" বা এর মতো কিছু নয়। এটি কেবল পাঠ্য রেন্ডার হয়েছে।

এটি বলার পরে, আপনি আপনার জাভাস্ক্রিপ্টে এই জাতীয় প্রতিস্থাপন রাখতে পারেন।

<script type="text/javascript"> 
   var a = "{{someDjangoVariable}}";
</script>

এটি আপনাকে "গতিশীল" জাভাস্ক্রিপ্ট দেয়।


29
যদিও দ্রষ্টব্য যে এই সমাধান অনুসারে , এটি ইনজেকশন আক্রমণগুলিতে ঝুঁকিপূর্ণ
কেসব্যাশ

13
@ ক্যাসাব্যাশ: এই জাতীয় উপলক্ষে escapejsফিল্টার উপস্থিত রয়েছে:escapejs('<>') -> u'\\u003C\\u003E'
টমাসজ জিলিস্কি

24
কেবলমাত্র রেফারেন্সের জন্য এটি যুক্ত করার জন্য: "কিছুডাঙ্গাও পরিবর্তনযোগ্য" যদি জেএসওএন হতে পারে তবে & quot মুছে ফেলার জন্য {{কিছু জ্যাঙ্গোভেরিয়েবল | নিরাপদ} use ব্যবহার করতে ভুলবেন না;
চিহ্নিত করুন

4
এই উত্তরটি কেবল একটি সাধারণ ভেরিয়েবলের জন্য কাজ করে, এটি কোনও জটিল ডেটা কাঠামোর জন্য কাজ করে না। এই ক্ষেত্রে, সহজ সমাধানটি হ'ল ডেটা স্ট্রাকচারকে অতিক্রম করতে এবং জাভাস্ক্রিপ্টে অনুরূপ একটি তৈরি করতে ক্লায়েন্ট-সাইড কোড যুক্ত করা build যদি জটিল ডেটা কাঠামোটি জেএসএন ফর্ম্যাটে থাকে তবে অন্য সমাধান হ'ল এটিকে সিরিয়ালাইজ করা, সার্ভার-সাইড কোডে জ্যাঙ্গো টেমপ্লেটে একটি সিরিয়ালযুক্ত জেএসওএন পাস করুন এবং ক্লায়েন্ট-সাইড কোডের একটি জাভাস্ক্রিপ্ট অবজেক্টে জেএসওএনকে ডিসায়রিয়াল করুন। নীচে একটি উত্তর এই বিকল্প উল্লেখ করে।
অ্যালান ইভাঞ্জেলিস্টা

14
জাভাস্ক্রিপ্ট যদি অন্য কোনও ফাইলে লেখা থাকে তবে কী হবে?
the_ অজানা_স্পরিট

64

সতর্কতা জাজানো কোর এবং একইভাবে এক্সএসএস দুর্বলতার সাথে একইভাবে ট্যাগ যুক্ত করার জন্য ব্যবহারকারীদের উত্পন্ন ডেটা সহ এই টেমপ্লেট ট্যাগটি ব্যবহার করে আলোচনার জন্য টিকিট # 17419 দেখুন । মন্তব্য amacneil আলোচনা থেকে উদ্বেগ অধিকাংশ টিকেট উত্থাপিত।


আমি মনে করি এটি করার সর্বাধিক নমনীয় এবং সহজ উপায় হ'ল আপনি জেএস কোডে যে পরিবর্তনগুলি ব্যবহার করতে চান তার জন্য একটি টেম্পলেট ফিল্টার সংজ্ঞায়িত করা। এটি আপনাকে নিশ্চিত করতে সহায়তা করে যে আপনার ডেটা সঠিকভাবে পালিয়ে গেছে এবং আপনি জটিল ডাটা স্ট্রাকচার, যেমন dictএবং এর সাহায্যে এটি ব্যবহার করতে পারেন list। এজন্য প্রচুর উত্সাহ সহ একটি স্বীকৃত উত্তর থাকা সত্ত্বেও আমি এই উত্তরটি লিখছি।

এখানে টেম্পলেট ফিল্টার একটি উদাহরণ:

// myapp/templatetags/js.py

from django.utils.safestring import mark_safe
from django.template import Library

import json


register = Library()


@register.filter(is_safe=True)
def js(obj):
    return mark_safe(json.dumps(obj))

এই টেম্পলেট ফিল্টারগুলি ভেরিয়েবলটিকে JSON স্ট্রিংয়ে রূপান্তর করে। আপনি এটি এর মতো ব্যবহার করতে পারেন:

// myapp/templates/example.html

{% load js %}

<script type="text/javascript">
    var someVar = {{ some_var | js }};
</script>

3
এটি দুর্দান্ত কারণ এটি জাভাস্ক্রিপ্ট এবং সার্ভার-সাইড কোডে কিছু জ্যাঙ্গো টেমপ্লেট ইনপুট ভেরিয়েবলগুলি অনুলিপি করার অনুমতি দেয় তবে জাভাস্ক্রিপ্ট দ্বারা কোন ডেটা স্ট্রাকচার অবশ্যই ব্যবহার করা উচিত তা জেনে রাখা দরকার না এবং তাই জাঙ্গো টেমপ্লেট রেন্ডার করার আগে জেএসএনে রূপান্তরিত করতে হবে। হয় এটি ব্যবহার করুন বা সবসময় জাভাস্ক্রিপ্টে সমস্ত জাজানো ভেরিয়েবল অনুলিপি করুন।
অ্যালান ইভাঞ্জেলিস্টা


1
পছন্দ করুন safeযথাযথ রূপান্তর এবং পলায়ন ছাড়াই কেবল মান হিসাবে নিরাপদ হিসাবে চিহ্নিত করে।
ইয়ারোস্লাভ অ্যাডমিন

2
এরপরে আপনি কীভাবে জ্যাঙ্গো টেমপ্লেটে ভেরিয়েবলটি প্রদর্শন করবেন?
কেবিদেব

1
@ সান্দি ফিরে যখন আমি পোস্ট করলাম এটি পৃথক জেএস ফাইলে একটি উইজেট থাকা এবং পৃষ্ঠা উত্স কোডে এটি সূচনা করা সাধারণ ছিল। সুতরাং আসুন আমরা function myWidget(config) { /* implementation */ }জেএস ফাইলে ঘোষণা করে এবং কিছু পৃষ্ঠায় এটি ব্যবহার করার চেয়েও ব্যবহার করি myWidget({{ pythonConfig | js }})। তবে আপনি এটি জেএস ফাইলগুলিতে ব্যবহার করতে পারবেন না (যেমন আপনি লক্ষ্য করেছেন), তাই এর সীমাবদ্ধতা রয়েছে।
ইয়ারোস্লাভ অ্যাডমিন

51

আমার জন্য কাজ করা একটি সমাধানটি টেমপ্লেটে লুকানো ইনপুট ক্ষেত্রটি ব্যবহার করছে

<input type="hidden" id="myVar" name="variable" value="{{ variable }}">

তারপরে জাভাস্ক্রিপ্টে এইভাবে মান পাওয়া,

var myVar = document.getElementById("myVar").value;

3
সতর্ক থাকুন। আপনি কীভাবে ভেরিয়েবল / ফর্মটি ব্যবহার করেন তার উপর নির্ভর করে ব্যবহারকারীরা যা চান তার মধ্যে রাখতে পারেন।
অ্যান্ডিল

3
আপনি আপনার ইনপুট ক্ষেত্রটি কেবল পঠন উপযোগে সেট করতে চাইতে পারেন (এই লিঙ্কটি w3schools.com/tags/att_input_readonly.asp দেখুন )
এভারেস্ট

যদি এটি এমন কিছু হয় যা কোনও ডাটাবেস পরিবর্তন করে না বা একটি ডাটাবেস কোয়েরিতে প্রেরণ করা না হয় তবে এটি ঠিক আছে be @ অ্যান্ডিএল
জেমস 111

3
বন্ধুরা ... ব্যবহারকারীরা যাই হোক না কেন তারা যা করতে চায় তা করতে পারে। একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত ডিওএম ইন্সপেক্টর এবং ডিবাগিং সরঞ্জামগুলির মাধ্যমে ব্রাউজারগুলি আজকাল এটিকে এত সহজ করে তুলেছে। গল্পটির নৈতিকতা: সার্ভারে আপনার সমস্ত ডেটা বৈধকরণ করুন ।
ব্যবহারকারী 2867288

1
দয়া করে কেউ আমাকে বলতে পারেন আপনি কীভাবে কোনও বহিরাগত জাভাস্ক্রিপ্ট ফাইলটিতে সেই পরিবর্তনশীলটি অ্যাক্সেস করবেন?
আহতিশাম

27

জ্যাঙ্গো ২.১ হিসাবে, এই ব্যবহারের ক্ষেত্রে টেমপ্লেট ট্যাগে একটি নতুন নির্মিত নির্মিত বিশেষভাবে প্রবর্তিত হয়েছে: json_script

https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#json-script

নতুন ট্যাগটি নিরাপদে টেমপ্লেট মানগুলিকে সিরিয়ালাইজ করবে এবং এক্সএসএস থেকে রক্ষা করবে।

জ্যাঙ্গো ডক্স সংক্ষিপ্তসার:

জাভাস্ক্রিপ্ট সহ ব্যবহারের জন্য প্রস্তুত, একটি ট্যাগে আবৃত জেএসএন হিসাবে নিরাপদে একটি পাইথন অবজেক্টকে আউটপুট করে।


10

আমি খুব সহজেই যা করছি তা এখানে: আমি আমার টেমপ্লেটের জন্য আমার বেস html ফাইলটি সংশোধন করেছি এবং এটি নীচে রেখেছি:

{% if DJdata %}
    <script type="text/javascript">
        (function () {window.DJdata = {{DJdata|safe}};})();
    </script>
{% endif %}

তারপরে আমি যখন জাভাস্ক্রিপ্ট ফাইলগুলিতে কোনও ভেরিয়েবলটি ব্যবহার করতে চাই, তখন আমি একটি ডিজেডাটা অভিধান তৈরি করি এবং আমি এটি একটি জেসন দ্বারা প্রসঙ্গে যুক্ত করি: context['DJdata'] = json.dumps(DJdata)

আশা করি এটা সাহায্য করবে!


এটি ব্যবহার করবেন না, এটি স্ক্রিপ্ট ইনজেকশন (এক্সএসএস) এর ঝুঁকিপূর্ণ।
পিসওয়ার্ল্ড

8

একটি অভিধানের জন্য, আপনি প্রথমে JSON এ এনকোডিংয়ের সেরা। আপনি সিম্পজসন.ডম্পস () ব্যবহার করতে পারেন বা অ্যাপ ইঞ্জিনে কোনও ডেটা মডেল থেকে রূপান্তর করতে চাইলে আপনি জিকিউএলএনসিডার লাইব্রেরি থেকে এনকোড () ব্যবহার করতে পারেন।


1
নোট করুন যে 'সিম্পলজসন' জাঙ্গো ১.7 থেকে 'জসন' হয়ে গেছে, আমি বিশ্বাস করি।
ফাইভ ক্লাবগুলি

4

আমি সিমিলার ইস্যুটির মুখোমুখি হয়েছি এবং এস.লোটের প্রস্তাবিত উত্তর আমার পক্ষে কাজ করেছে।

<script type="text/javascript"> 
   var a = "{{someDjangoVariable}}"
</script>

তবে আমি এখানে বড় প্রয়োগের সীমাবদ্ধতা নির্দেশ করতে চাই । আপনি যদি নিজের জাভাস্ক্রিপ্ট কোডটি বিভিন্ন ফাইলে রাখার পরিকল্পনা করছেন এবং সেই ফাইলটি আপনার টেম্পলেটে অন্তর্ভুক্ত করবেন। এটি কাজ করবে না।

এটি কেবল তখনই কাজ করবে যখন আপনি প্রধান টেমপ্লেট এবং জাভাস্ক্রিপ্ট কোড একই ফাইলে থাকবেন। সম্ভবত জাঙ্গো দল এই সীমাবদ্ধতাটিকে মোকাবেলা করতে পারে।


1
আমরা কীভাবে এটিকে কাটিয়ে উঠতে পারি?
সিএসবা তোথ

2
এ থেকে উত্তরণের জন্য, আপনি স্থির জাভাস্ক্রিপ্ট ফাইল অন্তর্ভুক্ত করার ঠিক আগে প্রদর্শিত উদাহরণের মতো বিশ্বব্যাপী জাভাস্ক্রিপ্ট ভেরিয়েবলগুলি রাখতে পারেন। আপনার স্ট্যাটিক জাভাস্ক্রিপ্ট ফাইলটিতে সমস্ত গ্লোবাল ভেরিয়েবলের অ্যাক্সেস থাকবে।
বোবার্ট

এটি ব্যবহার করবেন না, এটি স্ক্রিপ্ট ইনজেকশন (এক্সএসএস) এর ঝুঁকিপূর্ণ।
pcworld

তারা সার্ভার সাইডে ডেটা বৈধ করতে পারে।
মুহাম্মদ ফয়জান ফরিদ

4

আমিও এর সাথে লড়াই করে যাচ্ছি। পৃষ্ঠতলে মনে হয় উপরের সমাধানগুলি কাজ করা উচিত। তবে, জাঙ্গো আর্কিটেকচারের জন্য প্রতিটি এইচটিএমএল ফাইলের নিজস্ব রেন্ডারড ভেরিয়েবল থাকা (যেমন, {{contact}}রেন্ডার করা হয় contact.html, যখন {{posts}}উদাহরণস্বরূপে চলে যায় index.html)। অন্যদিকে, <script>ট্যাগ পরে প্রদর্শিত {%endblock%}মধ্যে base.htmlযা থেকে contact.htmlএবং index.htmlউত্তরাধিকারী। এর মূলত এর অর্থ হ'ল যে কোনও সমাধান সহ

<script type="text/javascript">
    var myVar = "{{ myVar }}"
</script>

ব্যর্থ হতে বাধ্য, কারণ পরিবর্তনশীল এবং স্ক্রিপ্ট একই ফাইলে সহ থাকতে পারে না।

অবশেষে আমি যে সহজ সমাধানটি নিয়ে এসেছি এবং আমার জন্য কাজ করেছিলাম তা হ'ল আইডি দিয়ে একটি ট্যাগ দিয়ে ভেরিয়েবলটি মোড়ানো এবং পরে জেএস ফাইলটিতে এটি উল্লেখ করা:

// index.html
<div id="myvar">{{ myVar }}</div>

এবং তারপর:

// somecode.js
var someVar = document.getElementById("myvar").innerHTML;

এবং মাত্র অন্তর্ভুক্ত <script src="static/js/somecode.js"></script>মধ্যে base.htmlযথারীতি। অবশ্যই এটি কেবল বিষয়বস্তু পাওয়ার বিষয়ে। সুরক্ষা সম্পর্কিত, অন্যান্য উত্তরগুলি অনুসরণ করুন।


আপনি সম্ভবত এর .textContentপরিবর্তে ব্যবহার করতে চান .innerHTML, কারণ অন্যথায় যে সংস্থাগুলি এইচটিএমএল-এনকোডযুক্ত রয়েছে তারাও জেএস ভেরিয়েবলের অংশ হবে। তবে তারপরেও এটি পুনরুত্পাদন করা হতে পারে 1: 1 (আমি নিশ্চিত না)।
পিসওয়ার্ল্ড

একটি ব্যাখ্যা । আমি ভেরিয়েবলের ক্ষেত্রে ক্ষেত্রের মানগুলি ক্যাপচারের জন্য একইভাবে ব্যবহার করি ( ফর্মটিতে গতিরূপে তৈরি আইডি ব্যবহার করে) এবং এটি কাজ করছে (তবে কেবলমাত্র একটি ফর্মসেট সারিটির জন্য )। আমি যা দেখতে পাচ্ছি না তা হ'ল ফর্ম্যাসেট ক্ষেত্রগুলির সমস্ত সারি থেকে মানগুলি ক্যাপচার করা , যা ম্যানুয়ালি পপুলেটিং হচ্ছে (অর্থাত লুপের জন্য এইচটিএমএল টেবিলটিতে )। যেমন আপনি ভিজ্যুয়ালাইজ করবেন কেবলমাত্র সর্বশেষ ফর্মসেট সারিটির ভেরিয়েবলগুলি ভেরিয়েবলগুলিতে প্রেরণ করা হবে এবং লুপের জন্য ফর্মসেট সারিগুলির মধ্য দিয়ে অগ্রগতি হওয়ার সাথে সাথে পূর্ববর্তী মানগুলি ওভাররাইট করা হবে। এই কাছাকাছি উপায় আছে?
ব্যবহারকারী 12379095

3

একটি জাভাস্ক্রিপ্ট অবজেক্টটি পাঠাগার হিসাবে জ্যাঙ্গো ক্ষেত্রে সংরক্ষণ করা হয়েছে, যার জন্য আবার একটি জাভাস্ক্রিপ্ট অবজেক্টে অন-পৃষ্ঠায় স্ক্রিপ্টে গতিশীল inোকানো দরকার, আপনাকে escapejsএবং উভয়ই ব্যবহার করতে হবে JSON.parse():

var CropOpts = JSON.parse("{{ profile.last_crop_coords|escapejs }}");

জাজানো এর escapejsউদ্ধৃতিটি সঠিকভাবে পরিচালনা করে এবং JSON.parse()স্ট্রিংটিকে জেএস বস্তুতে রূপান্তর করে।


2

দ্রষ্টব্য, আপনি যদি কোনও বহিরাগত .js স্ক্রিপ্টে কোনও ভেরিয়েবল পাস করতে চান তবে আপনাকে অন্য স্ক্রিপ্ট ট্যাগের সাথে আপনার স্ক্রিপ্ট ট্যাগের আগে গ্লোবাল ভেরিয়েবল ঘোষণা করতে হবে।

<script type="text/javascript">
    var myVar = "{{ myVar }}"
</script>

<script type="text/javascript" src="{% static "scripts/my_script.js" %}"></script>

data হিসাবে যথারীতি ভিউতে সংজ্ঞায়িত করা হয় get_context_data

def get_context_data(self, *args, **kwargs):
    context['myVar'] = True
    return context

বিশ্বব্যাপী একটি পরিবর্তনশীল ঘোষণার অংশটি আসলে সহায়ক ছিল।
রাহুল

যদি আপনি উপরের মতো টেমপ্লেটগুলি থেকে জেএস ভেরিয়েবলগুলিতে ডেটা রেন্ডার করেন তবে অবশ্যই একই পৃষ্ঠাতে রেন্ডার করতে হবে (তাদের বৈশ্বিক করুন) এবং অন্যান্য কোড পৃথক জেএস ফাইলগুলিতে যায়। সার্ভারে অবশ্যই বৈধ ডেটা করা উচিত কারণ ব্যবহারকারী ব্রাউজার থেকে পরিবর্তন করতে পারেন।
মুহাম্মদ ফয়জান ফরিদ

1

আমি জ্যাঙ্গো ২.১ এ এইভাবে ব্যবহার করি এবং আমার পক্ষে কাজ করি এবং এই উপায়টি সুরক্ষিত (রেফারেন্স) :

জ্যাঙ্গো পক্ষ:

def age(request):
    mydata = {'age':12}
    return render(request, 'test.html', context={"mydata_json": json.dumps(mydata)})

এইচটিএমএল দিক:

<script type='text/javascript'>
     const  mydata = {{ mydata_json|safe }};
console.log(mydata)
 </script>

0

আপনি পুরো স্ক্রিপ্টটি একত্রিত করতে পারেন যেখানে আপনার অ্যারে ভেরিয়েবলটি স্ট্রিং হিসাবে ঘোষণা করা হয়েছে, নীচে,

views.py

    aaa = [41, 56, 25, 48, 72, 34, 12]
    prueba = "<script>var data2 =["
    for a in aaa:
        aa = str(a)
        prueba = prueba + "'" + aa + "',"
    prueba = prueba + "];</script>"

যা নীচে একটি স্ট্রিং উত্পন্ন করবে

prueba = "<script>var data2 =['41','56','25','48','72','34','12'];</script>"

এই স্ট্রিং থাকার পরে, আপনাকে অবশ্যই এটি টেমপ্লেটে প্রেরণ করতে হবে

views.py

return render(request, 'example.html', {"prueba": prueba})

টেম্পলেটটিতে আপনি এটি পেয়েছেন এবং জাভাস্ক্রিপ্ট কোডের ঠিক আগে যেখানে আপনার এটি প্রয়োজন তার আগে এটি এইচটিএম কোড হিসাবে একটি সাহিতিক উপায়ে ব্যাখ্যা করুন for

টেমপ্লেট

{{ prueba|safe  }}

এবং নীচে এটি আপনার কোডের বাকী নীচে, মনে রাখবেন যে উদাহরণে ব্যবহারযোগ্য ভেরিয়েবলটি ডেটা 2

<script>
 console.log(data2);
</script>

এইভাবে আপনি ডেটা ধরণের রাখবেন, যা এই ক্ষেত্রে একটি ব্যবস্থা


এটি কেবল তখনই ব্যবহার করুন আপনি যদি নিশ্চিত হন যে aaaকেবলমাত্র সংখ্যার মধ্যে রয়েছে তবে অন্যথায় এক্সএসএস (স্ক্রিপ্ট ইনজেকশন) সম্ভব is
পিসওয়ার্ল্ড

0

জাভাস্ক্রিপ্টের ভিতরে দুটি জিনিস আমার পক্ষে কাজ করেছে:

'{{context_variable|escapejs }}'

এবং অন্যান্য: view.py এ

from json import dumps as jdumps

def func(request):
    context={'message': jdumps('hello there')}
    return render(request,'index.html',context)

এবং এইচটিএমএলে:

{{ message|safe }}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.