如何在Django模板的列表中解压缩列表?
我有一个模型,其中包含两个名为“ RecoaterData”和“ recoaterTimeStamp”的字段。这些字段存储一个整数列表(希望这是一种适当的方法?)。一个记录的示例为:
RecoaterData = [124,254,366,744,326,743,858,347,734,236,758,533,675,854,58,
464,447,473,437,996,655,689,644,856,547,235,784,323,]
我的目标:
我想在一段时间内绘制这些记录的图形。所以我想我可以查询我感兴趣的记录,然后将它们附加到一个大列表中,然后在模板中访问此列表。但是我似乎无法弄清楚如何将其放入模板的单个列表中。相反,我得到的是列表列表。
这是我在模板中运行{{recoaters}}时看到的内容:
['[528, 277, 672, 324, 621, 195, 820, 209, 146, 462, 635, 829, 153, 480,
779, 587, 202, 102, 455, 738, 268, 537, 481,
300, 233, 788, 483, 716, 469, 313]', '[721, 885, 141, 679, 800, 656, 407,
596, 666, 247, 708, 783, 310, 142, 315,
566, 701, 722, 716, 804, 313, 112, 810, 263, 597, 747, 806]']
我想要什么:
[528, 277, 672, 324, 621, 195, 820, 209, 146, 462, 635, 829, 153, 480,
779, 587, 202, 102, 455, 738, 268, 537, 481,
300, 233, 788, 483, 716, 469, 313, 721, 885, 141, 679, 800, 656, 407,
596, 666, 247, 708, 783, 310, 142, 315,
566, 701, 722, 716, 804, 313, 112, 810, 263, 597, 747, 806]
views.py
class recoaterDataListView(LoginRequiredMixin,ListView):
model = Data
template_name = 'charts.html'
login_url = 'login'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
query = Data.objects.filter(author_id = self.kwargs ["author"], ProcessIdentifier_data=self.kwargs['pi'])
Recoaters = []
TimeStamps = []
for data in query:
Recoaters.append(data.RecoaterData)
TimeStamps.append(data.recoaterTimeStamp)
context['recoaters'] = Recoaters
context['timestamps'] = TimeStamps
return context
答案 0 :(得分:0)
为了naming convention,您应该将变量名称设置为recoaters
和timestamps
:
recoaters = []
timestamps = []
for data in query:
recoaters.append(data.RecoaterData)
timestamps.append(data.recoaterTimeStamp)
context['recoaterdata'] = recoaters
context['timedata'] = timestamps
在您的模板中,如果我理解正确,也许您想使用以下方式在列表时间戳中显示每个元素:
{% for each_timestamp in timestamps %}
{{ each_timestamp }}
{% endfor %}
答案 1 :(得分:0)
如果值在Django模板中是可迭代的,则可以对其进行迭代,而不管它是否是另一个可迭代的成员。只需将查询集直接放入上下文中并使用它即可。
context['recoaters'] = Data.objects.filter(
# ...
)
您可以以这种方式遍历它们,而无需建立新列表,也不会丢失数据关系。
{% for recoater in recoaters %}
...
{% for timestamp in recoater.recoaterTimeStamp.all %}
...
{% endfor %}
{% endfor %}
如果您所说的大部分都是准确的,则recoater.recoaterTimeStamp
似乎是多对多关系或外键的反向引用。无论哪种情况,这都行得通。如果不是这种情况,那么这里正在发生其他事情,并且不清楚在没有模型的情况下会发生什么。
答案 2 :(得分:0)
存储在数据库中的列表实际上存储为字符串。因此,我必须先将它们转换为列表,然后将列表连接在一起以获得一个列表。这可行:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
query = Data.objects.filter(author_id = self.kwargs ["author"], ProcessIdentifier_data=self.kwargs['pi'])
Recoaters = []
TimeStamps = []
for data in query:
Recoaterstring = ast.literal_eval(data.RecoaterData)
Recoaters = Recoaters+Recoaterstring
timestampString = ast.literal_eval(data.RecoaterData)
TimeStamps = TimeStamps+timestampString
context['recoaters'] = Recoaters
context['times'] = TimeStamps
return context