Доступ к объектам по имени из dict - PullRequest
1 голос
/ 14 марта 2019

Пользователи могут иметь несколько списков, и у меня есть объекты DataItem, прикрепленные к спискам, эти объекты DataItem имеют числовые значения, и теперь мне нужно будет извлечь все значения по имени списка и вставить их в chart.js My view выглядит следующим образом:

@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)

Шаблон: это часть наборов данных chart.js на html-странице, и она правильно отображает имена списков, как мне вызывать значения, связанные с этимиимена?

{% 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 голосов
/ 14 марта 2019

Вы можете просто зациклить list_data объекта словаря.

DataItem.objects.filter(list=list) должен возвращать элемент списка, а не элемент запроса. Поэтому постарайтесь получить список значений, которые вам нужны. например,

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

list_data содержит имя метки и данные . key как label и value как data

Так как у вас есть ключ и значение. Вам не нужно зацикливать user_lists

{% for key, value in list_data.items %}
{
   label: '{{key}}',
     data: '{{value}}',
}
{% endfor %}
0 голосов
/ 14 марта 2019

, поскольку вам нужны целочисленные данные для ваших диаграмм, простое решение - добавить свойство к вашей 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...