¿Cómo acceder al elemento del diccionario en la plantilla django?

Tengo este código en la plantilla, que me gustaría imprimir el número de votos que obtuvo cada opción. los votos son solo un diccionario mientras que las elecciones son un objeto modelo.

{% for choice in choices %} {{choice.choice}} - {{votes[choice.id]}} 
{% endfor %}

genera una excepción con este mensaje “No se pudo analizar el rest”

Para hacerme eco del comentario de Jeff, a lo que creo que debería aspirar es simplemente una propiedad en su clase de Elección que calcula el número de votos asociados con ese objeto:

  class Choice(models.Model): text = models.CharField(max_length=200) def calculateVotes(self): return Vote.objects.filter(choice = self).count() votes = property(calculateVotes) 

Y luego en tu plantilla, puedes hacer:

  {% for choice in choices %} {{choice.choice}} - {{choice.votes}} 
{% endfor %}

La etiqueta de la plantilla es IMHO un poco excesiva para esta solución, pero tampoco es una solución terrible. El objective de las plantillas en Django es aislarlo del código en sus plantillas y viceversa.

Probaría el método anterior y vería qué SQL genera el ORM, ya que no estoy seguro de que vaya a guardar en caché las propiedades y simplemente crear una subselección para la propiedad o si será iterativamente / en demanda ejecutar la consulta para calcular el recuento de votos. Pero si genera consultas atroces, siempre puede rellenar la propiedad en su vista con datos que ha recostackdo usted mismo.

 choices = {'key1':'val1', 'key2':'val2'} 

Aquí está la plantilla:

 
    {% para clave, valor en choices.items%}
  • {{clave}} - {{valor}}
  • {% endfor%}

Básicamente, .items es una palabra clave de Django que divide un diccionario en una lista de pares (clave, valor). Esto permite la iteración sobre un diccionario en una plantilla de Django.

Puedes usar la notación de puntos:

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

  • Búsqueda en el diccionario (por ejemplo, foo [“bar”])
  • Búsqueda de atributos (por ejemplo, foo.bar)
  • Método de llamada (por ejemplo, foo.bar ())
  • Lista de búsqueda de índice (por ejemplo, foo [2])

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

Debe encontrar (o definir) una etiqueta de plantilla ‘obtener’, por ejemplo, aquí .

La definición de la etiqueta:

 @register.filter def hash(h, key): return h[key] 

Y se usa como:

 {% for o in objects %} 
  • {{ dictionary|hash:o.id }}
  • {% endfor %}

    Usar artículos del diccionario

      {% for key, value in my_dictionay.items %} 
  • {{ key }} : {{ value }}
  • {% endfor %}

    Nombre del filtro django_template_filter get_value_from_dict

     {{ your_dict|get_value_from_dict:your_key }} 

    Similar a la respuesta por @russian_spy:

     
      {% for choice in choices.items %}
    • {{choice.0}} - {{choice.1}}
    • {% endfor %}

    Esto podría ser adecuado para desglosar diccionarios más complejos.

    Lo ideal es crear un método en el objeto de elección que se encuentre en los votos o crear una relación entre los modelos. Una etiqueta de plantilla que realizó la búsqueda en el diccionario también funcionaría.