I\'m trying to pass a Query Set from Django to a template with javascript.
I\'ve tried different approaches to solve this:
1. Normal Approach - Javas
EDIT: please don't use this method, see @agconti's answer.
Use the escapejs filter: https://docs.djangoproject.com/en/1.4/ref/templates/builtins/#escapejs
Example of dumping a list:
var foo = [{% for x in y %}'{{ x|escapejs }}',{% endfor %}]
Since Django 2.1 there is the json-script template tag. From the docs:
json_script
Safely outputs a Python object as JSON, wrapped in a tag, ready for use with JavaScript.
Argument: HTML “id” of the tag.
For example:
{{ value|json_script:"hello-data" }}
If value is the dictionary
{'hello': 'world'}
, the output will be:<script id="hello-data" type="application/json"> {"hello": "world"} </script>
The resulting data can be accessed in JavaScript like this:
var value = JSON.parse(document.getElementById('hello-data').textContent);
XSS attacks are mitigated by escaping the characters “<”, “>” and “&”. For example if value is
{'hello': 'world</script>&'}
, the output is:<script id="hello-data" type="application/json"> {"hello": "world\\u003C/script\\u003E\\u0026amp;"} </script>
This is compatible with a strict Content Security Policy that prohibits in-page script execution. It also maintains a clean separation between passive data and executable code.