Plantillas Django y atributos variables.

Estoy usando Google App Engine y Django templates.
Tengo una tabla en la que quiero que los objetos se vean como:

Object Result: Items = [item1,item2] Users = [{name='username',item1=3,item2=4},..] 

La plantilla de Django es:

  {% for item in result.items %}  {% endfor %}  {% for user in result.users %}  {% for item in result.items %}  {% endfor %}  {% endfor %} 
user{{item}}
{{user.name}}{{ user.item }}

Ahora la documentación de Django dice que cuando ve un archivo . en variables
Intenta varias cosas para obtener los datos, uno de los cuales es la búsqueda en el diccionario, que es exactamente lo que quiero pero parece que no sucede …

Encontré una solución “mejor” / “mejor” para obtener variables dentro No es la mejor manera, pero funciona.

Instala un filtro personalizado en django que obtiene la clave de su dict como parámetro

Para hacer que funcione en el motor de aplicaciones de google, necesita agregar un archivo a su directorio principal, llamé al mío django_hack.py que contiene este pequeño fragmento de código

 from google.appengine.ext import webapp register = webapp.template.create_template_register() def hash(h,key): if key in h: return h[key] else: return None register.filter(hash) 

Ahora que tenemos este archivo, todo lo que tenemos que hacer es decirle al motor de la aplicación que lo use … lo hacemos agregando esta pequeña línea a su archivo principal

 webapp.template.register_template_library('django_hack') 

y en la vista de plantilla, agregue esta plantilla en lugar del código habitual

 {{ user|hash:item }} 

Y debe funcionar perfectamente =)

Supongo que la parte que no funciona es {{ user.item }} .

Django intentará una búsqueda en el diccionario, pero utilizará la cadena "item" y no el valor de la variable de bucle de item . Django hizo lo mismo cuando resolvió {{ user.name }} en el atributo de name del objeto de user , en lugar de buscar una variable llamada name .

Creo que tendrá que hacer un preprocesamiento de los datos en su vista antes de procesarlos en su plantilla.

O puede usar el sistema django predeterminado que se usa para resolver atributos en tempaltes como este:

 from django.template import Variable, VariableDoesNotExist @register.filter def hash(object, attr): pseudo_context = { 'object' : object } try: value = Variable('object.%s' % attr).resolve(pseudo_context) except VariableDoesNotExist: value = None return value 

Eso solo funciona

en su plantilla:

 {{ user|hash:item }} 

@Dave Webb (no he sido calificado lo suficientemente alto como para comentar aún)

Las búsquedas de puntos se pueden resumir así: cuando el sistema de plantillas encuentra un punto en un nombre de variable, realiza las siguientes búsquedas, en este orden:

 * Dictionary lookup (ee, foo["bar"]) * Attribute lookup (eg, foo.bar) * Method call (eg, foo.bar()) * List-index lookup (eg, foo[bar]) 

El sistema utiliza el primer tipo de búsqueda que funciona. Es una lógica de cortocircuito.

Como reemplazo de k, v en user.items en Google App Engine usando plantillas django donde user = {‘a’: 1, ‘b’, 2, ‘c’, 3}

 {% for pair in user.items %} {% for keyval in pair %} {{ keyval }}{% endfor %}
{% endfor %}

un 1
b 2
c 3

pair = (clave, valor) para cada elemento del diccionario.

no debería esto:

 {{ user.item }} 

¿ser esto?

 {{ item }} 

no hay ningún objeto de usuario en el contexto dentro de ese bucle …?