用于对象HTML的键的循环实现



我有一个充满天气对象的查询集,我需要遍历一个自定义数组,以在Django应用程序的HTML模板中提取每个天气对象中的特定天气指标。

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> 

但我无法在一个循环中实现自动化。为什么?我已经验证了变量列表中的变量是正确的,应该可以工作。可能是因为变量只是字符串的替代项吗?

如果您编写:

{{weather_object.variable}}

它的目标是从weather_object获得名为variable的属性,如果失败,它将尝试使用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>
{% foritem in weather_object%}
<td>{{ item }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>

最新更新