2011-02-23 10 views
5

De acuerdo con la documentación de Django he registrado mi filtro:¿Cómo registro un filtro personalizado en el sistema de plantillas de Google App Engine?

from google.appengine.ext.webapp import template 
# ... 
register = template.create_template_register() 
@register.filter(name='wld') 
def wld(result): 
    if result == 1 : return "win" 
    if result == 0 : return "loss" 
    if result == 0.5 : return "draw" 
    return "unknown" 
self.response.out.write(template.render("player.html", template_values)) 

en alguna parte de la plantilla que tengo código:
{{result|wld}}

y cuando trato de hacer mi plantilla, me sale el error: TemplateSyntaxError: Invalid filter: 'wld'

¿Qué estoy haciendo mal?

Respuesta

12

Una vez que haya creado su biblioteca de etiquetas personalizadas, es necesario registrarse con el motor de plantillas de Django:

from google.appengine.ext.webapp import template 
template.register_template_library('path.to.lib') 

Tenga en cuenta que la llamada template.register_template_library es una envoltura que se proporciona como parte del SDK de App Engine. Una vez que haya puesto esto en su main.py, las nuevas etiquetas o filtros deberían estar disponibles en todas sus plantillas sin más trabajo. No es necesario usar la etiqueta {% load %}.

Una nota importante: el funcionamiento de register_template_library variará según la versión de Django que esté utilizando en su aplicación de App Engine. Si está utilizando 0.96, el parámetro será la ruta al archivo de la biblioteca de etiquetas personalizadas. Si está utilizando Django 1.2, lo hará mediante una ruta de módulo de python a la biblioteca de etiquetas personalizadas. Publiqué instrucciones para hacer que esto funcione in a post on my blog.

+1

¡Gracias! Una vez que creé el directorio 'tags' colocando vacío' __init __. Py' y 'mytags.py', conteniendo el filtro de registro y llamando' template.register_template_library ('tags.mytags') 'de main.py, ¡todo funcionó bien! – rmflow

+0

Excelente. Muy contento de escucharlo. –

+1

¡No necesitar usar la etiqueta '{% load%}' fue la clave para una hora de diversión! –

0

Debe agregar el bloque {% load the_name_of_that_module %} en cada plantilla que planea usar este filtro.

+0

Obviamente me falta algo, solo tengo main.py script y player.html template. El código anterior se ejecuta en main.py. ¿Cómo debería ser la etiqueta 'load'? – rmflow

+0

GAE utiliza el sistema de plantillas Django de forma predeterminada y, por lo tanto, sigue las [mismas reglas] (http://docs.djangoproject.com/en/1.2/howto/custom-template-tags/). Básicamente, la etiqueta 'load' es una etiqueta incorporada, pero debe colocar sus filtros/etiquetas personalizados en un lugar particular en su paquete de proyecto. Recomiendo leer esa documentación, ya que explica a fondo el tema. –