How can I pass my context variables to a javascript file in Django?
I don't think it's possible this way. If you want to access some data provided by the view, you have to pass it to the js function.
Example
js file:
my_cool_js_function(some_param){
// do some cool stuff
}
view
// some html code
my_cool_js_function({{param}})
hope this helps :)
I would also add because I ran into the error a few times that if the python variable is an object it will throw a syntax error unless you put it in quotes, in other words, within your template,
<script>
var my_var = '{{ python_object|escapejs }}';
</script>
Furthermore, before putting that object in the context it is best to first serialize it to JSON, or you'll end up having to do string parsing. I found also that date objects needed to be converted to strings before this step.
import jsonpickle
context['python_object'] = jsonpickle.encode(python_object)
And finally, in the JS you can then iterate through the object properly and use the values as you probably would have in python by doing:
var my_var_parsed = jQuery.parseJSON(my_var);
There is now a more secure way to pass context to a javascript file using the built-in template tag json_script
with an argument which would be the id set for the created element.
Use case would be:
{{ mydata|json_script:"mydata" }}
Then link your javascript file:
<script src="{% static 'myjavascriptfile.js' %}"></script>
the script tag would have to come after the template tag i'm guessing
Which can then be accessed in your javascript file like:
const mydata = JSON.parse(document.getElementById('mydata').textContent);
Sources
django 3.1 docs json_script
Another source with a proper explanation
In addition to Andrzej Bobak's answer, you can also generate a global variable in Javascript from your template. For example, your template might generate code like this:
<script>
var my_chart = {{ the_chart }};
</script>
Your script could then refer to my_chart
.