2011-01-31 10 views
129

utilizo interfaz de los 'mensajes' para pasar mensajes al usuario como esto:Rendering una variable de plantilla como HTML

request.user.message_set.create(message=message) 

me gustaría incluir html en mi variable de {{ message }} y hacerlo sin escapar el marcado en el modelo.

Respuesta

230

Si desea dont't HTML escapado, mira el filtro safe y la etiqueta autoescape

FILTRO: {{ myhtml |safe }}
http://docs.djangoproject.com/en/dev/ref/templates/builtins/#safe

ETIQUETA: {% autoescape off %}{{ myhtml }}{% endautoescape %} http://docs.djangoproject.com/en/dev/ref/templates/builtins/#autoescape

+2

WOW. dentro de los 40 segundos 4 respuestas –

+0

Si necesita mostrar, por ejemplo, signos de moneda como euro ('€'), el dólar pasó de la vista este es el camino a seguir. – andi

21

Puede reproducir una plantilla en el código de este modo:

from django.template import Context, Template 
t = Template('This is your <span>{{ message }}</span>.') 

c = Context({'message': 'Your message'}) 
html = t.render(c) 

Véase el Django docs para más información.

+0

creo que tengo el lado equivocado de la vara aquí, pero les dejo la respuesta por ahora. –

27

Uso del autoescape para encender HTML escapar fuera:

{% autoescape off %}{{ message }}{% endautoescape %} 
+0

Creo que definitivamente debemos proporcionar '{% endautoescape%}' en lugar de 'autoescape on'. Muestra un error si no cerramos – Surya

+0

@Surya: Whoops, arreglado eso. – mipadi

20

Si quieres hacer algo más complicado con tu texto, puedes crear tu propio filtro y hacer algo de magia antes de devolver el html. Con un archivo templatag con este aspecto:

from django import template 
from django.utils.safestring import mark_safe 

register = template.Library() 

@register.filter 
def do_something(title, content): 

    something = '<h1>%s</h1><p>%s</p>' % (title, content) 
    return mark_safe(something) 

Entonces se puede inscribir esto en el archivo de plantilla

<body> 
... 
    {{ title|do_something:content }} 
... 
</body> 

Y esto le daría un buen resultado.

5

No es necesario utilizar el filtro o la etiqueta en la plantilla. Simplemente use format_html() para traducir la variable a html y Django automáticamente desactivará el escape para su variable.

format_html("<h1>Hello</h1>") 

Salida aquí https://docs.djangoproject.com/en/1.9/ref/utils/

Cuestiones relacionadas