Para hacer eco / ampliar el comentario de Jeff, lo que creo que debería apuntar es simplemente una propiedad en su clase Choice 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 su plantilla, puede hacer:
{% for choice in choices %}
{{choice.choice}} - {{choice.votes}} <br />
{% endfor %}
La etiqueta de la plantilla, en mi humilde opinión, es un poco exagerada para esta solución, pero tampoco es una solución terrible. El objetivo 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 la parte superior de mi cabeza si pre-almacenará en caché las propiedades y solo creará una subselección para la propiedad o si iterativamente / en- demanda ejecutar la consulta para calcular el recuento de votos. Pero si genera consultas atroces, siempre puede llenar la propiedad en su vista con los datos que ha recopilado usted mismo.
.items
llamada (como se ilustra en una de las otras respuestas) es una solución mucho más simple.Aquí está la plantilla:
Básicamente,
.items
es una palabra clave de Django que divide un diccionario en una lista de(key, value)
pares, al igual que el método Python.items()
. Esto permite la iteración sobre un diccionario en una plantilla de Django.fuente
items
es una llamada al método Python en el diccionario, no una palabra clave de Django. Como señala Alex Martelli , es básicamente lo mismo queiteritems
. Como respondió Wilhelm, la búsqueda en el diccionario es la tercera en prioridad para las búsquedas de puntos. Si tiene un elemento en su diccionario llamado'items'
, obtendrá ese valor en lugar de una lista de tuplas. Para probar: agréguelo{'items':'oops'}
a su diccionario y obtendrá una lista con viñetas de la palabra 'oops'puedes usar la notación de puntos:
fuente
my_dict[1][2]
plantilla:my_dict.1.2
d.key.1
- tenga en cuenta la segunda.
Debe encontrar (o definir) una etiqueta de plantilla 'get', por ejemplo, aquí .
La definición de etiqueta:
Y se usa como:
fuente
h.get(key,'default_value')
debido a KeyErrorUsar elementos del diccionario:
fuente
django_template_filter nombre del filtro get_value_from_dict
fuente
Similar a la respuesta de @russian_spy:
Esto podría ser adecuado para desglosar diccionarios más complejos.
fuente
Idealmente, crearía un método en el objeto de elección que se encontrara en los votos, o crearía una relación entre los modelos. También funcionaría una etiqueta de plantilla que realizara la búsqueda del diccionario.
fuente