Pregunta

Estoy usando plantillas de Google App Engine y Django.
Tengo una tabla en la que quiero que los objetos se vean así:

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 el documentación de Django afirma que cuando ve un . en variables
Intenta varias cosas para obtener los datos, una de las cuales es la búsqueda en el diccionario, que es exactamente lo que quiero, pero no parece suceder...

¿Fue útil?

Solución

Encontré una solución "mejor"/"mejor" para obtener variables dentro de su mejor manera, pero funciona.

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

Para que funcione en Google App-Engine, debe 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 su vista de plantilla agregue esta plantilla en lugar del código habitual

{{ user|hash:item }}

Y debería funcionar perfectamente =)

Otros consejos

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

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

Creo que necesitarás realizar un preprocesamiento de los datos en tu vista antes de representarlos en tu plantilla.

O puede usar el sistema Django predeterminado que se usa para resolver atributos en plantillas como esta:

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 simplemente funciona

en tu plantilla:

{{ user|hash:item }}

@Dave Webb (todavía no he recibido una calificación lo suficientemente alta como para comentar)

Las búsquedas de puntos se pueden resumir así:cuando el sistema de plantillas encuentra un punto en el nombre de una 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 utiliza 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 de Django donde usuario = {'a':1, 'b', 2, 'c', 3}

{% for pair in user.items %}
   {% for keyval in pair %} {{ keyval }}{% endfor %}<br>
{% endfor %}

un 1
segundo 2
c 3

par = (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...?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top