Mi proyecto Wagtail actual tiene una estructura muy simple con algunas páginas genéricas que tienen solo un cuerpo RichTextField . Estas son solo páginas básicas de tipo CMS donde un editor editará algún contenido en el editor de texto enriquecido y lo publicará.
Una de las páginas (y probablemente más en el tiempo) es una página de "Se necesita ayuda" y utiliza un fragmento de JavaScript externo de un servicio de terceros que enumera las ofertas de trabajo actuales con enlaces a las aplicaciones que alojan.
Dado que agregar una etiqueta <script> al editor de texto enriquecido simplemente lo escapa y muestra solo el valor del texto, agregué extra_scripts = models.TextField() adicional a mi modelo de página junto con un FieldPanel('extra_scripts') al contenido paneles Esto permite que un usuario pegue algunos fragmentos de JavaScript arbitrarios.
Si incluyo este valor de campo en mi plantilla con {{page.extra_scripts}} , solo muestra el contenido y no ejecuta javascript. Mirando a través de las wagtailcore_tags disponibles, no veo un filtro que deba usar para ejecutar el contenido, y cuando se usa con una etiqueta {{}} , supongo que el motor de plantillas lo maneja para que no se ejecute.
¿Cómo puedo incluir este campo en una plantilla para que se ejecute el javascript?
Sé que puedo cambiar el campo para que solo sea el contenido javascript real sin la etiqueta <script> , pero el fragmento también incluye algunos elementos HTML básicos, y los usuarios finales no sabrán intuitivamente que necesitan editar manualmente el proporcionado fragmento si solo les doy un campo para pegar ciertas partes del fragmento. Quiero que el usuario final pueda simplemente copiar/pegar el fragmento que obtiene y hacer que funcione sin que necesite entender nada más.
Esto es el resultado del comportamiento de escape automático del lenguaje de plantilla Django y se puede anular agregando un filtro |safe :
{{ page.extra_scripts|safe }}Por supuesto, solo debe hacer esto si sus usuarios editoriales son de plena confianza, ya que les dará la capacidad de ejecutar código arbitrario (incluido, por ejemplo, secuestrar la cookie de sesión de un superusuario que visita esa página).