Problemas accediendo a diccionarios en template

299 views
Skip to first unread message

Luchi

unread,
Aug 9, 2010, 3:56:43 PM8/9/10
to Django-es
Hola me ha surgido una duda. Qusiera saber como hacer para acceder a
un diccionario desde un template.
Suponiendo un ejemplo:

vista:

def datos(request):

dicLetra = { "A":"1", "B":"2", "C":"3"}

return render_to_response(template, locals())

template: Aca es donde tengo el problema, por lo siguiente. Yo
quisiera recorrer el diccionario obteniendo las letras y despues con
ellas en la variable "letraClave" acceder al diccionario para obtener
el valor respectivoa dicha letra. Mi forma de hacerlo es asi:

{% for letraClave in dicLetra %}

<p>Letra: {{ letraClave }}</p>

<ul>

{% for numero in dicLetra.letraClave %}

<li>{{ numero }} </li>

{% endfor %}

</ul>

{% endfor %}

El problema es que de esta forma no funciona ya que no me toma
letraClave como una variable sino como el valor de clave, es decir que
si yo pongo "dicLetra.A" me retornaria el 1.
En este ejemplo parece tonto lo que quiero hacer pero el tema es que
lo necesito para otra cosa y la verdad es que no se me ocurre como
hacer que se tome a letraClave como su valor.

Agradezco cualquier comentario.
Desde ya muchas gracias.
Luchi

Rolando Espinoza La Fuente

unread,
Aug 9, 2010, 5:42:30 PM8/9/10
to djan...@googlegroups.com
2010/8/9 Luchi <luchim...@gmail.com>:
[...]

> {% for letraClave in dicLetra %}
>        <p>Letra: {{ letraClave }}</p>
>        <ul>
>                {% for numero in dicLetra.letraClave %}
>                        <li>{{ numero }} </li>
>                {% endfor %}
>        </ul>
> {% endfor %}
>
> El problema es que de esta forma no funciona ya que no me toma
> letraClave como una variable sino como el valor de clave, es decir que
> si yo pongo "dicLetra.A" me retornaria el 1.

Proba:

{% for key, values in dicLetra.items %}
<p>Letra: {{ key }}</p>
<ul>
{% for num in values %}
<li>{{ num }}</li>


{% endfor %}
</ul>
{% endfor %}

Estoy suponiendo que tienes una lista en los valores para cada llave, tipo:
{"A": [1, 2, 3]}

Ya que dictLetra es un dict, la manera usual para recorrer sus llaves y valores
es usar el método items() o iteritems()

Puedes probar en la consola y ver que retorna:

>>> dictLetra = {"A": [1, 2, 3]}
>>> dictLetra.items()

~Rolando

Luchi

unread,
Aug 10, 2010, 7:33:31 AM8/10/10
to Django-es
Gracias Rolando, pero igualmente me he expresado con un ejemplo que
tal vez no se asemejaba tanto a lo que necesitaba por el hecho de que
yo no debo recorrer todas las claves del diccionario, sino acceder a
una especifica para poder asi obviar la busqueda inneceseria en el
diccionario:

Es decir por ejemplo, dado el valor de la letra a la que yo quiero
acceder, yo quisiera desde ahi obtener los elementos asociados a esa
clave por ejemplo:

letraClave = 'D'
objetos = diccionario[letraClave]

el tema es que esto es valido en python pero a la hora de utilizarlo
en un template no, y no se bien como se hace o si se puede ....
Agradezco tu respuesta y si se te ocurre algo espero me lo comentes,
gracias
Saludos
Luchi

Rolando Espinoza La Fuente

unread,
Aug 10, 2010, 11:46:42 AM8/10/10
to djan...@googlegroups.com
2010/8/10 Luchi <luchim...@gmail.com>:

> Gracias Rolando, pero igualmente me he expresado con un ejemplo que
> tal vez no se asemejaba tanto a lo que necesitaba por el hecho de que
> yo no debo recorrer todas las claves del diccionario, sino acceder a
> una especifica para poder asi obviar la busqueda inneceseria en el
> diccionario:
>
> Es decir por ejemplo, dado el valor de la letra a la que yo quiero
> acceder, yo quisiera desde ahi obtener los elementos asociados a esa
> clave por ejemplo:
>
> letraClave = 'D'
> objetos = diccionario[letraClave]
>
> el tema es que esto es valido en python pero a la hora de utilizarlo
> en un template no, y no se bien como se hace o si se puede ....

Django es resctrictivo en cuanto a lo que puedes hacer, por ejemplo, no puedes
llamar a un método que tenga argumentos[1]. No se podría hacer {{ dict.get k }}

En cambio en jinja2 podrías hacer:

{% for val in diccionario[letraClave] %}

o

{% for val in diccionario.get(letraClave) %}

Una alternativa en django sería un template filter[2], para que puedas hacer:

{% for k in diccionario %}
{% for v in diccionario|getitem:k %}
....
o
{% with diccionario|getitem:k as value %}

algo sencillo como:

@register.filter
def getitem(value, arg):
return value.get(arg)

[1] http://docs.djangoproject.com/en/dev/ref/templates/api/#rendering-a-context
[2] http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

Rolando Espinoza La fuente
www.insophia.com

Antoni Aloy

unread,
Aug 10, 2010, 1:18:50 PM8/10/10
to djan...@googlegroups.com
2010/8/10 Luchi <luchim...@gmail.com>:

> Gracias Rolando, pero igualmente me he expresado con un ejemplo que
> tal vez no se asemejaba tanto a lo que necesitaba por el hecho de que
> yo no debo recorrer todas las claves del diccionario, sino acceder a
> una especifica para poder asi obviar la busqueda inneceseria en el
> diccionario:
>
> Es decir por ejemplo, dado el valor de la letra a la que yo quiero
> acceder, yo quisiera desde ahi obtener los elementos asociados a esa
> clave por ejemplo:
>
> letraClave = 'D'
> objetos = diccionario[letraClave]
>

Esto no se puede hacer directamente, se supone que si sabes ya la
letra podrías pasar el parámetro por código en lugar de utilizar el
diccionario. Si por lo que sea no te va bien así puedes crear tu
propio templatetag.

Antes de crear el templatetag plantéate si no hay otra manera de
hacerlo. Las plantillas deben tener sólo la lógica imprescindible para
la capa de presentación.


--
Antoni Aloy López
Blog: http://trespams.com
Site: http://apsl.net

Reply all
Reply to author
Forward
0 new messages