通过dict按名称访问对象

时间:2019-03-14 17:08:27

标签: django django-templates

用户可以有多个列表,并且我有连接到列表的DataItem对象,这些DataItem对象具有数字值,现在我需要按列表名称检索所有值并将其插入chart.js我的视图看起来像这样:

@login_required
def app(request):
    form = list_form
    form2 = data_form(user=request.user)
    user = request.user.pk
    user_lists = List.objects.filter(user=user)
    #Here I have lists in dict but I have no idea how to call them in template.
    list_data = {}
    for list in user_lists:
        list_data[list.name] = DataItem.objects.filter(list=list)

    context = {'user_lists': user_lists, 'form': form, 'form2': form2,
    'list_data': list_data}

    return render(request, 'app/app.html', context)

模板:这是html页面中的chart.js数据集部分,它正确显示了列表名称,如何调用与这些名称相关的值?

{% for list in user_lists %}
 {
     label: '{{ list.name }}',
     data: [?????????],
 },
{% endfor %}

模型(如果需要)

class List(models.Model):
        name = models.CharField(max_length=100, default="")
        user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='lists')

    def __str__(self):
        return self.name

    class Meta:
        unique_together = ['name', 'user']

    @property
    def chart_data(self):
        return ', '.join([str(x.data) for x in self.data_items])



class DataItem(models.Model):
    data = models.IntegerField(default=0)
    list = models.ForeignKey(List, on_delete=models.CASCADE, related_name='data_items')

2 个答案:

答案 0 :(得分:0)

由于图表需要整数数据,因此简单的解决方案是为List模型添加属性:

class List(models.Model):
            name = models.CharField(max_length=100, default="")
            user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='lists')

    @property
    def chart_data(self):
        return ', '.join([str(x.data) for x in self.data_items.all()])

并在模板中:

{% for list in user_lists %}
 {
     label: '{{ list.name }}',
     data: [{{ list.chart_data }}],
 },
{% endfor %}

答案 1 :(得分:0)

您可以只循环list_data一个字典对象。

DataItem.objects.filter(list=list)必须返回列表项而不是查询项。 因此,尝试获取所需的值列表。例如

DataItem.objects.filter(list=list).values_list('data',flat=True)

list_data包含标签名称和数据keylabelvaluedata

因为您拥有关键和价值。您不需要循环user_lists

{% for key, value in list_data.items %}
{
   label: '{{key}}',
     data: '{{value}}',
}
{% endfor %}