Tengo un conjunto de consultas lleno de objetos meteorológicos y necesito recorrer una matriz personalizada para extraer métricas meteorológicas específicas en cada uno de los objetos meteorológicos en una plantilla HTML para una aplicación Django.
detalle.html
<table> <tr> {% for weather_object in weather_objects %} {% for variable in variable_list %} ## variable_list = ['temp', 'humidity'] <td>{{weather_object.variable}}</td> {% endfor %} {% endfor %} </tr> </table>Vistas.py
context = {'weather_objects': weather_objects, 'variable_list': variable_list} return render( request, 'webapp/detail.html', context=context )Podría haber mejores maneras de hacer esto, pero honestamente, estoy realmente perplejo aquí. ¿Por qué no puedo recorrer la lista de variables y extraer datos de weather_object? Es específicamente 'weather_object.variable' que simplemente actúa como inexistente.
Puedo hacerlo manualmente, puedo escribir específicamente
<td>{{weather_objects.temp}}</td>o
<td>{{weather_objects.humidity}}</td>pero no puedo automatizarlo en un bucle for a. ¿¿Por qué?? He verificado que las variables en la lista de variables son correctas y deberían funcionar. ¿Podría ser porque la variable es solo un sustituto de cadena?
Si tú escribes:
{{weather_object .variable }} su objetivo es obtener el atributo llamado variable de weather_object , y si eso falla, intentará usar weather_object['variable'] . El hecho de que haya una variable llamada variable no importa. Eso también sería muy inestable: imagina que asignas una variable llamada humidity = 'temp' . Rompería fácilmente la aplicación ya que ahora todos los item.humidity de repente deberían usar item.temp en su lugar. Eso sería un mal diseño de código.
Sin embargo, una plantilla no debe implementar la lógica comercial: solo debe implementar la lógica de representación. Es la vista la que necesita pasar datos de manera accesible a la vista.
Por ejemplo, puede construir una lista de listas para sus weather_objects con:
variable_list = ['temp', 'humidity'] weather_data = [ [ getattr(datum, v) for v in variable_list] for datum in wheather_objects ] context = {'weather_data': weather_data } return render( request, 'webapp/detail.html', context=context )y luego renderizar esto como:
<table> {% for weather_object in weather_data %} <tr> {% for item in weather_object %} <td>{{ item }}</td> {% endfor %} </tr> {% endfor %} </table>