可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
When I render a page using the Django template renderer, I can pass in a dictionary variable containing various values to manipulate them in the page using {{ myVar }}
.
Is there a way to access the same variable in Javascript (perhaps using the DOM, I don\'t know how Django makes the variables accessible)? I want to be able to lookup details using an AJAX lookup based on the values contained in the variables passed in.
回答1:
The {{variable}}
is substituted directly into the HTML. Do a view source; it isn\'t a \"variable\" or anything like it. It\'s just rendered text.
Having said that, you can put this kind of substitution into your JavaScript.
<script type=\"text/javascript\">
var a = \"{{someDjangoVariable}}\";
</script>
This gives you \"dynamic\" javascript.
回答2:
CAUTION Check ticket #17419 for discussion on adding similar tag into Django core and possible XSS vulnerabilities introduced by using this template tag with user generated data. Comment from amacneil discusses most of the concerns raised in the ticket.
I think the most flexible and handy way of doing this is to define a template filter for variables you want to use in JS code. This allows you to ensure, that your data is properly escaped and you can use it with complex data structures, such as dict
and list
. That\'s why I write this answer despite there is an accepted answer with a lot of upvotes.
Here is an example of template filter:
// 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))
This template filters converts variable to JSON string. You can use it like so:
// myapp/templates/example.html
{% load js %}
<script type=\"text/javascript\">
var someVar = {{ some_var | js }};
</script>
回答3:
A solution that worked for me is using the hidden input field in the template
<input type=\"hidden\" id=\"myVar\" name=\"variable\" value=\"{{ variable }}\">
Then getting the value in javascript this way,
var myVar = document.getElementById(\"myVar\").value;
回答4:
For a dictionary, you\'re best of encoding to JSON first. You can use simplejson.dumps() or if you want to convert from a data model in App Engine, you could use encode() from the GQLEncoder library.
回答5:
When the variable is returned by Django it turns all quotes into "
. Using {{someDjangoVariable|safe}}
causes a Javascript error.
To fix this use Javascript .replace
:
<script type=\"text/javascript\">
var json = \"{{someDjangoVariable}}\".replace(/"/g,\"\\\"\")
</script>
回答6:
Here is what I\'m doing very easily:
I modified my base.html file for my template and put that at the bottom:
{% if DJdata %}
<script type=\"text/javascript\">
(function () {window.DJdata = {{DJdata|safe}};})();
</script>
{% endif %}
then when I want to use a variable in the javascript files, I create a DJdata dictionary and I add it to the context by a json : context[\'DJdata\'] = json.dumps(DJdata)
Hope it helps!
回答7:
I was facing simillar issue and answer suggested by S.Lott worked for me.
<script type=\"text/javascript\">
var a = \"{{someDjangoVariable}}\"
</script>
However I would like to point out major implementation limitation here.
If you are planning to put your javascript code in different file and include that file in your template. This won\'t work.
This works only when you main template and javascript code is in same file.
Probably django team can address this limitation.
回答8:
I\'ve been struggling with this too. On the surface it seems that the above solutions should work. However, the django architecture requires that each html file has its own rendered variables (that is, {{contact}}
is rendered to contact.html
, while {{posts}}
goes to e.g. index.html
and so on). On the other hand, <script>
tags appear after the {%endblock%}
in base.html
from which contact.html
and index.html
inherit. This basically means that any solution including
<script type=\"text/javascript\">
var myVar = \"{{ myVar }}\"
</script>
is bound to fail, because the variable and the script cannot co-exist in the same file.
The simple solution I eventually came up with, and worked for me, was to simply wrap the variable with a tag with id and later refer to it in the js file, like so:
// index.html
<div id=\"myvar\">{{ myVar }}</div>
and then:
// somecode.js
var someVar = document.getElementById(\"myvar\").innerHTML;
and just include <script src=\"static/js/somecode.js\"></script>
in base.html
as usual.
Of course this is only about getting the content. Regarding security, just follow the other answers.
回答9:
For a JavaScript object stored in a Django field as text, which needs to again become a JavaScript object dynamically inserted into on-page script, you need to use both escapejs
and JSON.parse()
:
var CropOpts = JSON.parse(\"{{ profile.last_crop_coords|escapejs }}\");
Django\'s escapejs
handles the quoting properly, and JSON.parse()
converts the string back into a JS object.
回答10:
Note, that if you want to pass a variable to an external .js script then you need to precede your script tag with another script tag that declares a global variable.
<script type=\"text/javascript\">
var myVar = \"{{ myVar }}\"
</script>
<script type=\"text/javascript\" src=\"{% static \"scripts/my_script.js\" %}\"></script>
data
is defined in the view as usual in the get_context_data
def get_context_data(self, *args, **kwargs):
context[\'myVar\'] = True
return context