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>