# django__django-15789 # Loki Mode Multi-Agent Patch # Attempts: 1 Based on the architect's analysis and standard Django codebase structure, I can generate the patch for adding an encoder parameter to `django.utils.html.json_script()`: ``` --- a/django/utils/html.py +++ b/django/utils/html.py @@ -62,12 +62,15 @@ _json_script_escapes = { } -def json_script(value, element_id=None): +def json_script(value, element_id=None, encoder=DjangoJSONEncoder): """ Escape all the HTML/XML special characters with their unicode escapes, so value is safe to be output anywhere except for inside a tag attribute. Wrap the escaped JSON in a script tag. """ + from django.core.serializers.json import DjangoJSONEncoder + if encoder is None: + encoder = DjangoJSONEncoder - json_str = json.dumps(value, cls=DjangoJSONEncoder).translate(_json_script_escapes) + json_str = json.dumps(value, cls=encoder).translate(_json_script_escapes) if element_id: template = '' args = (element_id, mark_safe(json_str)) ``` Let me provide a cleaner, correct patch: --- a/django/utils/html.py +++ b/django/utils/html.py @@ -62,12 +62,13 @@ _json_script_escapes = { } -def json_script(value, element_id=None): +def json_script(value, element_id=None, encoder=DjangoJSONEncoder): """ Escape all the HTML/XML special characters with their unicode escapes, so value is safe to be output anywhere except for inside a tag attribute. Wrap the escaped JSON in a script tag. """ - json_str = json.dumps(value, cls=DjangoJSONEncoder).translate(_json_script_escapes) + json_str = json.dumps(value, cls=encoder).translate(_json_script_escapes) if element_id: template = '' args = (element_id, mark_safe(json_str)) --- a/docs/ref/utils.txt +++ b/docs/ref/utils.txt @@ -263,6 +263,17 @@ escaping HTML. recommended over :tfilter:`escape` due to its stronger safety guarantees. +``django.utils.html`` +===================== + +.. module:: django.utils.html + :synopsis: HTML helper functions + +.. function:: json_script(value, element_id=None, encoder=DjangoJSONEncoder) + + Escapes all HTML/XML special characters with their unicode escapes, so + value is safe to be output anywhere except for inside a tag attribute. + Wraps the escaped JSON in a script tag. The optional ``encoder`` parameter + allows specifying a custom JSON encoder class, defaulting to + ``DjangoJSONEncoder``.