2010-02-07 18 views
7

Estoy tratando de iterar sobre un diccionario de valores de modelo en una plantilla de Django. Deseo enumerar el nombre detallado de cada campo de modelo junto con su valor.¿Qué pasa aquí? Iteración sobre un diccionario en la plantilla de Django

Esto es lo que tengo en models.py:

class Manors(models.Model): 
    structidx = models.IntegerField(primary_key=True, verbose_name="ID")  
    county = models.CharField(max_length=5, null=True, blank=True, verbose_name="County") 

    def get_fields(self): 
      d = {} 
      #d["database"] = "pubs" 
      #d["uid"] = "sa" 
      for field in Manors._meta.fields: 
       d[field.verbose_name(self)] = field.value_to_string(self) 
      return d 

Y en views.py:

manor_stats = Manors.objects.get(structidx__exact=id) 
    return render_to_response('template.html', { 'place' : place, 'manor_stats' : manor_stats }, context_instance = RequestContext(request)) 

Y en la plantilla:

<h4>Statistics</h4> 
<ul> 
{% for key, value in manor_stats.get_fields %} 
<li> {{ key }}: {{ value }} </li> 
{% endfor %} 
</ul> 

Pero acabo de obtener una lista extraña, de aspecto distorsionado como:

u: i 
d: a 

Ni siquiera funciona si utilizo valores codificados en models.py (como se ha comentado anteriormente).

¿Qué pasa aquí? Estado tratando de resolver esto por horas :(

---------- --------------- ACTUALIZADO

Tratando con

def get_fields(self): 
     d = {} 
     for field in Manors._meta.fields: 
      d[field.verbose_name(self)] = { "verbose": field.verbose_name(self), "value": field.value_to_string(self) } 
     return d 

y en la plantilla:

<h4>Statistics</h4> 
<ul> 
{% for key, value in manor_stats.get_fields %} 
<li> {{ key }}: {{ value }}</li> 
{% endfor %} 
</ul> 

solo produce una lista en blanco ....

Respuesta

29

iterar un diccionario no se necesita:

<h4>Statistics</h4> 
<ul> 
{% for key, value in manor_stats.get_fields.items %} 
<li> {{ key }}: {{ value }}</li> 
{% endfor %} 
</ul> 

Pero me gustaría sugerir recuperar el diccionario de la primera función:

Views.py:

manor_stats = Manors.objects.get(structidx__exact=id).get_fields() 
    return render_to_response('template.html', { 'place' : place, 'manor_stats' : manor_stats }, context_instance = RequestContext(request)) 

Y luego:

<h4>Statistics</h4> 
<ul> 
{% for key, value in manor_stats.items %} 
<li> {{ key }}: {{ value }}</li> 
{% endfor %} 
</ul> 

Pero solo porque no estoy tan familiarizado con la cantidad de desreferencia que puede hacer el sistema de plantillas. Al ver que sabes cómo respetarlo, estás ahorrando el esfuerzo de lograr que el renderizador lo resuelva.

+0

I no tengo palabras para usted, señor.: * – vanguard69

0

usted está consiguiendo los resultados extraños, porque creo que estés interactuando sobre una st personajes del anillo Un bucle for en las plantillas django no es lo mismo que en python. Intente usar un objeto e iterar a través de los accesos de propiedad for object in my objects y luego use object.prop1object.prop2.

+0

lo siento, necesito un poco más de explicación ... ¿te refieres a cambiar get_fields para devolver un objeto?o deshacerse de get_fields por completo y devolver un objeto de otra manera? :( – AP257

+0

Simplemente cambie una línea: d [field.verbose_name (self)] = {"verbose": field.verbose_name (self), "value": field.value_to_string (self)} –

+0

Thank you - see my updated code above sin embargo, esto solo produce una lista en blanco ... – AP257

1

Iterar sobre un dict produce sus claves. No sé por qué Django cree que desea hacer una expansión incompleta de la secuencia en el nombre de la clave en lugar de lanzar una excepción, pero lo atribuiré al OTRA una de las peculiaridades del motor de plantillas de Django.

De todos modos, sí, obtenga key del dict en su bucle for, luego use key y dict.key dentro de él.

Cuestiones relacionadas