Pasar un diccionario a un template HTML

1,802 views
Skip to first unread message

Jose Caballero

unread,
Oct 12, 2008, 5:30:24 PM10/12/08
to djan...@googlegroups.com
Hola,

primero, antes que nada, pedir disculpas si es una pregunta demasiado tonta. Pero tengo que admitir que he intentado buscar documentación al respecto y no he encontrado nada. Y no es fácil, porque buscar en google "django dictionary template" no es precisamente una búsqueda muy selectiva.

=========================================

Imaginemos un código como el siguiente

--------------------------------
nums={}
nums['1'] = 'uno'
nums['2'] = 'dos'
nums['3'] = 'tres'
nums['4'] = 'cuatro'

lista = ['1', '3']

for num in lista:
    print num, nums[num]
--------------------------------


que devuelve ...

'1 uno'
'3 tres'

=========================================


Pues necesitaría poder hacer lo mismo en un "template" HTML. Pero no encuentro la forma.
He probado a incluir en views.py algo como

----------------------------------------------------------------------------------------------------------------
return render_to_response('test.html', {'lista': lista, 'nums': nums})
----------------------------------------------------------------------------------------------------------------

y mi "template" test.html contiene una parte como esta:


----------------------------------------
{% for n in lista %}
    {{ n }} = {{ nums.n }} <br>
{% endfor %}
----------------------------------------


Pero lo único que obtengo es:

1 =
2 =

=========================================

Pregunta: ¿se puede hacer lo que yo quiero?
Si la respuesta es sí, ¿cómo? ¿qué es lo que se me está escapando?
Si la respuesta es no, entonces disculpad por las molestias. Ya me buscaré otra forma de hacerlo.



Muchas gracias.
Saludos,
Jose

Jose Jiménez López

unread,
Oct 12, 2008, 5:52:53 PM10/12/08
to djan...@googlegroups.com
Hola,

el uso de diccionarios en las templates de django siempre me ha traido de cabeza. Por suerte en la versión 1 parece que lo han solucionado.
De todas formas, según el código que tu estás intentando ejecutar, lo que hace es intentar mostrarn el valor de la clave 'n' (nums.n), no sustituyendo n por el número. Como django no encuentra ninguna clave n, te muestra ' '.

Creo que para lo que quieres hacer, tendrás que iterar dos veces, por ejemplo:


{% for n in lista %}
    {% for key, value in nums.items %}
        {% ifequal key n %}
            {{ n }} = {{ value }}
        {% endifequal %}
    {% endfor %}
{% endfor %}


Es un poco enrevesado, hay que hacer varios bucles, pero creo que es la única forma de hacerlo, o al menos la única que se me ocurre, si encuentras otra mejor avisa ;)

Saludos.

Jose Caballero

unread,
Oct 12, 2008, 5:55:27 PM10/12/08
to djan...@googlegroups.com
Muchas gracias.
Si funciona me viene de maravilla, aunque sea "enrevesado" :-)

Saludos
Jose

Jose Caballero

unread,
Oct 12, 2008, 5:58:47 PM10/12/08
to djan...@googlegroups.com
Por cierto, yo trabajo con la 0.96
Si me bajo la 1, ¿tendré que cambiar algo? ¿Es la versión 1 totalmente compatible hacia atrás con la 0.96?




El 12 de octubre de 2008 17:52, Jose Jiménez López <jjimen...@gmail.com> escribió:

Jose Jiménez López

unread,
Oct 12, 2008, 6:05:37 PM10/12/08
to djan...@googlegroups.com
Pues entonces no se si te va a funcionar el código que te he puesto, pensé que trabajabas con la 1.
Yo también trabajo con la 0.96 y tengo bastantes problemas con los diccionarios, voy a intentar buscarte algún enlace...

Matías Bellone

unread,
Oct 12, 2008, 6:09:42 PM10/12/08
to djan...@googlegroups.com
2008/10/12 Jose Jiménez López <jjimen...@gmail.com>:

> Creo que para lo que quieres hacer, tendrás que iterar dos veces, por
> ejemplo:
>
> {% for n in lista %}
> {% for key, value in nums.items %}
> {% ifequal key n %}
> {{ n }} = {{ value }}
> {% endifequal %}
> {% endfor %}
> {% endfor %}
>
>
> Es un poco enrevesado, hay que hacer varios bucles, pero creo que es la
> única forma de hacerlo, o al menos la única que se me ocurre, si encuentras
> otra mejor avisa ;)

Yo no sé mucho de Django pero, por lo que creo, estás haciendo un
bucle de más. La única razón para usar ese código es cuando querés
limitar los valores a mostrar a aquellos en lista (que, de todas
formas creo que lo deberías de hacer por fuera de la lista y no en la
vista.

Basándome en tu ejemplo, para mí el template tendría que ser:


{% for key, value in nums.items %}

{{ key }} = {{ value }}
{% endfor %}

¿O hay alguna razón para que eso no funcione y lo anterior sí?

Saludos,
Toote

--
Web: http://www.enespanol.com.ar

Jose Caballero

unread,
Oct 12, 2008, 6:12:12 PM10/12/08
to djan...@googlegroups.com
Este ejemplo me valdría si quisiera mostrar todo el diccionario. Pero no es el caso.


Saludos,
Jose

Matías Bellone

unread,
Oct 12, 2008, 6:16:53 PM10/12/08
to djan...@googlegroups.com
2008/10/12 Jose Caballero <jcaball...@gmail.com>:

> El 12 de octubre de 2008 18:09, Matías Bellone <matias...@gmail.com>
>>
>> Yo no sé mucho de Django pero, por lo que creo, estás haciendo un
>> bucle de más. La única razón para usar ese código es cuando querés
>> limitar los valores a mostrar a aquellos en lista (que, de todas
>> formas creo que lo deberías de hacer por fuera de la lista y no en la
>> vista.
>>
>> Basándome en tu ejemplo, para mí el template tendría que ser:
>>
>>
>> {% for key, value in nums.items %}
>> {{ key }} = {{ value }}
>> {% endfor %}
>>
>> ¿O hay alguna razón para que eso no funcione y lo anterior sí?
>>
>
>
>
> Este ejemplo me valdría si quisiera mostrar todo el diccionario. Pero no es
> el caso.
>


¿Y porqué dejarías que la vista filtre el diccionario? Eso no es tarea
de la vista (template) sino de la lógica de la aplicación.

La gracia de MVC es separar todo eso. Si el día de mañana decides
agregar vistas a tu aplicación, este template no te sirva porque lo
estás restringiendo a un uso muy particular y tengas que crear nuevos
templates demasiado parecidos. Lo que complicaría el sistema
innecesariamente.

Puede ser que esté tirando fruta de todas formas, pero al menos así lo
pensaría yo.

Jose Jiménez López

unread,
Oct 12, 2008, 6:21:13 PM10/12/08
to djan...@googlegroups.com
Estoy de acuerdo con matías, veo mejor filtrarlo en la vista, y no en el template.

Si miras en la documentación de Django, puedes ver como mostrar un diccionario:

{% for athlete in athlete_list %}
    {{ athlete.name }}
{% endfor %}

Jose Caballero

unread,
Oct 13, 2008, 1:14:00 AM10/13/08
to djan...@googlegroups.com



Si miras en la documentación de Django, puedes ver como mostrar un diccionario:

{% for athlete in athlete_list %}
    {{ athlete.name }}
{% endfor %}

 
Hola, eso ya lo había visto. Por eso pensaba que se podía hacer incluso si name es el valor de una variable (que en mi caso viene de recorrer la lista). Pero no funciona, como ya sabes.

Pero he probado la primera solución que me has propuesto y va bien. Muchísimas gracias.

Puede que parezca raro, pero por diversas razones necesito hacer el filtrado en el template, y no en la vista. Por cierto, en un futuro muy próximo voy a necesitar poder hacer, y de nuevo en el template y no en la vista, otro tipo de filtrado:


lista1 = [... valores ....]
lista2 = [... otros valores ... ]

for x in lista1:
     if x in lista2:
           hacer algo
     else:
           hacer otra cosa

y tampoco veo cómo hacerlo. Cualquier sugerencia es más que bienvenida. Quizás de nuevo un doble loop y comparar todos los valores entre sí...


Muchas gracias por todos vuestros comentarios.
Saludos,
Jose



Juan Ignacio

unread,
Oct 30, 2008, 4:37:07 AM10/30/08
to djan...@googlegroups.com
Así, a bote pronto, se me ocurre:

lista1 = [... valores ....]
lista2 = [... otros valores ... ]

expanded_list = [(x, x in lista2) for x in lista 1]

for (x, flag) in expanded_list:
if flag:
hacer algo
else:
hacer otra cosa


2008/10/13 Jose Caballero <jcaball...@gmail.com>:
--
Juan Ignacio Rodríguez de León
http://elornitorrincoenmascarado.blogspot.com/
euri...@gmail.com
Reply all
Reply to author
Forward
0 new messages