For-loop реализация ключа для объекта HTML

У меня есть набор queryset, полный объектов погоды, и мне нужно в цикле через пользовательский массив извлечь определенные метрики погоды в каждом из объектов погоды в HTML-шаблоне для приложения Django.

detail.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>

Views.py

context = {'weather_objects': weather_objects,
           'variable_list': variable_list}

return render(
    request,
    'webapp/detail.html',
    context=context
)

Возможно, есть лучшие способы сделать это, но, честно говоря, я действительно в тупике. Почему я не могу просмотреть список переменных и извлечь данные из weather_object? Конкретно 'weather_object.variable' просто не существует.

Я могу сделать это вручную, могу написать конкретно

<td>{{weather_objects.temp}}</td> 

или

<td>{{weather_objects.humidity}}</td> 

но я не могу автоматизировать это в цикле for a. Почему? Я проверил, что переменные в списке переменных правильные и должны работать. Может ли это быть потому, что переменная является только заменителем строки?

Если вы пишете:

{{weather_object.variable }}

он стремится получить атрибут named variable из weather_object, а если это не удается, он попытается использовать weather_object['variable']. Тот факт, что существует переменная с именем variable, не имеет значения. Это также было бы очень нестабильно: представьте, что вы присваиваете переменной имя humidity = 'temp'. Это легко сломает приложение, поскольку теперь все item.humidity вдруг должны использовать item.temp. Это был бы плохой дизайн кода.

Однако шаблон должен не реализовывать бизнес-логику: он должен реализовывать только логику рендеринга. Именно представление должно передавать данные доступным способом в представление.

Например, вы можете построить список списков для вашего weather_objects с помощью:

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
)

и затем отобразить это как:

<table>
  {% for weather_object in weather_data %}
    <tr>
      {% for item in weather_object %}
          <td>{{ item }}</td>
      {% endfor %}
    </tr>
  {% endfor %}
</table>
Вернуться на верх