2010-02-02 15 views
15

Para un nuevo proyecto estamos escribiendo documentación sobre el sistema de plantilla Django. Usamos Django también para el proyecto de documentación, por lo que Django recoge todas nuestras variables de ejemplo en el código de muestra e intenta renderizarlas. La única forma que hemos encontrado para evitar esto es usar {% templatetag %}, pero eso hace que nuestro código sea realmente ilegible. ¿Hay alguna forma de que Django ignore todas las variables de plantilla en una sección específica?Manera fácil de escapar Variables de plantilla Django

+0

1 - Buena pregunta. Yo también me gustaría saber la respuesta. – sberry

Respuesta

7

Debido a las limitaciones de Django template lexer (como ser un kludgy hack), esto es imposible. Sin embargo, si usted está dispuesto a poner su código de ejemplo en archivos separados, puede utilizar la etiqueta de ssi:

{% ssi /path/to/my/code/examples/example01.html %} 

y no va a analizar el archivo, basta con incluir textualmente. Sin embargo, esto también tiene limitaciones en el sentido de que no puede usar variables en la ruta de inclusión (es decir, si mueve las ubicaciones de la plantilla, debe reescribir o al menos buscar y reemplazar sus archivos de plantilla), y debe colocar el include ruta (es decir, /path/to/my/code/examples) en la configuración ALLOWED_INCLUDE_ROOTS en su settings.py. (Consulte http://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi.)

+2

+1 por "me gusta ser un kludgy hack". –

+1

Ha, nuestra solución inicial fue hacer esto con ajax, o usar "[" en lugar de "{" y reemplazarlos con javascript. Si nadie más logrará algo mejor, supongo que usted lo respondió. –

+0

Me gusta más tu idea de "'[' y cambiar con JS". – lawrence

3

Una posible solución es escribir las plantillas como de costumbre (con {{ x }}), pero guárdelas como .txt (o cualquier otra extensión que desee). Escriba un script que se ejecuta sobre estos archivos, y automáticamente crea el .html para usted, haciendo el reverso de templatetag (reemplazando {{ con {% templatetag openvariable %}, etc.). Asegúrese de que el código se ejecute después de actualizar las plantillas.

3

Lo resolví agregando una etiqueta de plantilla "include_raw" que se comporta como la etiqueta incorporada "include", pero simplemente no analiza ni procesa el archivo que se le pasa. Estoy ejecutando Django 1.2 en App Engine.

Crear un módulo de etiquetas (tags.py):

from django.template import loader 
from google.appengine.ext.webapp import template 

register = template.create_template_register() 

@register.simple_tag 
def include_raw(path): 
    return loader.find_template(path)[0] 

Puedes verlo:

from google.appengine.ext.webapp import template 

template.register_template_library("tags") 

usarlo:

{% include_raw "this-will-be-included-verbatim.html" %} 
3

Si la fuente es HTML, la solución más fácil sería reemplazar "{" y "}" con sus respectivas entidades HTML:

{ se convierte en {

} convierte }

Ejemplo:

<code> 
To include some other file, you can use the &#123;% include %&#125; template tag. 
To include a variable, use &#123;%&#123;% varname &#125;%&#125;%. 
</code> 
14

Django 1.5 resuelve este problema con la etiqueta verbatim plantilla:

{% verbatim myblock %} 
    Avoid template rendering via the {% verbatim %}{% endverbatim %} block. 
{% endverbatim myblock %} 
0

Aquí es una manera elegante de resolver al problema para Djan o 1.4. Es una etiqueta personalizada de Django. Simplemente crea un módulo verbatim_templatetag.No se analiza la carga {%}% verbatim_templatetag

Todo entre {% textualmente%} y {%}% endverbatim: py contiene el siguiente código:

""" 
jQuery templates use constructs like: 

    {{if condition}} print something{{/if}} 

This, of course, completely screws up Django templates, 
because Django thinks {{ and }} mean something. 

Wrap {% verbatim %} and {% endverbatim %} around those 
blocks of jQuery templates and this will try its best 
to output the contents with no changes. 
""" 

from django import template 

register = template.Library() 


class VerbatimNode(template.Node): 

    def __init__(self, text): 
     self.text = text 

    def render(self, context): 
     return self.text 


@register.tag 
def verbatim(parser, token): 
    text = [] 
    while 1: 
     token = parser.tokens.pop(0) 
     if token.contents == 'endverbatim': 
      break 
     if token.token_type == template.TOKEN_VAR: 
      text.append('{{') 
     elif token.token_type == template.TOKEN_BLOCK: 
      text.append('{%') 
     text.append(token.contents) 
     if token.token_type == template.TOKEN_VAR: 
      text.append('}}') 
     elif token.token_type == template.TOKEN_BLOCK: 
      text.append('%}') 
    return VerbatimNode(''.join(text)) 

Luego, en su plantilla.

Código de https://gist.github.com/ericflo/629508

Cuestiones relacionadas