首页 > 解决方案 > 从 dict 按名称访问对象

问题描述

用户可以有多个列表,我将 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')

标签: djangodjango-templates

解决方案


因为您的图表需要整数数据,所以简单的解决方案是向您的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 %}

推荐阅读