在Django模板的列表中解压缩列表

时间:2018-10-22 03:38:35

标签: python django

如何在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

3 个答案:

答案 0 :(得分:0)

为了naming convention,您应该将变量名称设置为recoaterstimestamps

    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