variable template ifequal bootstrap python django google-app-engine

ifequal - python templates django



Plantillas de Django y atributos variables (6)

Estoy usando las plantillas de Google App Engine y Django.
Tengo una tabla que quiero que los objetos se vean de la siguiente manera:

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

La plantilla de Django es:

<table> <tr align="center"> <th>user</th> {% for item in result.items %} <th>{{item}}</th> {% endfor %} </tr> {% for user in result.users %} <tr align="center"> <td>{{user.name}}</td> {% for item in result.items %} <td>{{ user.item }}</td> {% endfor %} </tr> {% endfor %} </table>

Ahora la documentación de Django dice que cuando ve a . en variables
Intenta varias cosas para obtener los datos, uno de los cuales es buscar en el diccionario, que es exactamente lo que quiero, pero parece que no ocurre ...


@Dave Webb (aún no me han calificado lo suficiente como para comentar)

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

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

El sistema usa el primer tipo de búsqueda que funciona. Es 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 %}<br> {% endfor %}

a 1
b 2
c 3

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


Encontré una solución "más agradable" / "mejor" para obtener variables dentro. No es la mejor manera, pero funciona.

Instalas un filtro personalizado en django que obtiene la clave de tu dict como parámetro

Para que funcione en el motor de aplicaciones de Google, necesitas agregar un archivo a tu directorio principal, llamé a django_hack.py que contiene este pequeño 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 su vista de plantilla agregue esta plantilla en lugar del código habitual

{{ user|hash:item }}

Y debería funcionar perfectamente =)


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 tu plantilla:

{{ user|hash:item }}


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

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

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


no debería esto:

{{ user.item }}

¿ser esto?

{{ item }}

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