1010from django .core .exceptions import ImproperlyConfigured
1111from django .db .models import Model
1212from django .http import HttpRequest
13+ from django .utils .html import conditional_escape
1314from django .views .generic .base import TemplateView
1415
1516from cachetools .lru import LRUCache
@@ -333,13 +334,21 @@ def get_frontend_context_variables(self) -> str:
333334 attributes = self ._attributes ()
334335 frontend_context_variables .update (attributes )
335336
336- # Remove any field in `javascript_exclude` from the `frontend_context_variables`
337+ # Remove any field in `javascript_exclude` from `frontend_context_variables`
337338 if hasattr (self , "Meta" ) and hasattr (self .Meta , "javascript_exclude" ):
338339 if isinstance (self .Meta .javascript_exclude , Sequence ):
339340 for field_name in self .Meta .javascript_exclude :
340341 if field_name in frontend_context_variables :
341342 del frontend_context_variables [field_name ]
342343
344+ safe_fields = []
345+ # Keep a list of fields that are safe to not sanitize from `frontend_context_variables`
346+ if hasattr (self , "Meta" ) and hasattr (self .Meta , "safe" ):
347+ if isinstance (self .Meta .safe , Sequence ):
348+ for field_name in self .Meta .safe :
349+ if field_name in frontend_context_variables :
350+ safe_fields .append (field_name )
351+
343352 # Add cleaned values to `frontend_content_variables` based on the widget in form's fields
344353 form = self ._get_form (attributes )
345354
@@ -363,6 +372,18 @@ def get_frontend_context_variables(self) -> str:
363372 ):
364373 frontend_context_variables [key ] = value
365374
375+ for (
376+ frontend_context_variable_key ,
377+ frontend_context_variable_value ,
378+ ) in frontend_context_variables .items ():
379+ if (
380+ isinstance (frontend_context_variable_value , str )
381+ and frontend_context_variable_key not in safe_fields
382+ ):
383+ frontend_context_variables [
384+ frontend_context_variable_key
385+ ] = conditional_escape (frontend_context_variable_value )
386+
366387 encoded_frontend_context_variables = serializer .dumps (
367388 frontend_context_variables
368389 )
0 commit comments