Объект 'Unicode' не имеет атрибута 'value1' - PullRequest
3 голосов
/ 19 апреля 2011

Если у меня есть список объектов в views.py, например:

myobjects=model.objects.all()

тогда я получаю значения поля объектов:

times=myobjects.values_list(‘time’, flat=True)

и затем я хочу установить атрибут для каждого объекта списка раз:

for mytime in times:
    mytime.value1=myobjects.filter(time=mytime).values_list(‘value1’,flat=true)
    mytime.value2=myobjects.filter(time=mytime).values_list(‘value2’,flat=true)

и использовать атрибут в html-файле шаблона, используя:

{%for mytime in times%}
<tr><td>{{mytime.value1}}</td><td>{{mytime.value2}}</td></tr>
{%endfor%}

Это дает мне ошибку: у объекта 'Unicode' нет атрибута 'value1'… (Примечание: конечно, также value2). Могу ли я сделать что-то еще, чтобы установить атрибут объекта mytime? Я думал, что object.attribute = значение достаточно, чтобы установить здесь атрибут. Спасибо

Решение: Я решил свою проблему, используя коды ниже:

objects=model.objects.all()
objects2=objects.filter(type=types[0]) # types is a list i got from user. the codes is used because i want limit type to only one type so that i could get unrepetitive time list later.
timelist=objects2.order_by('time').values('time','date','date_time','anyotherfield')
for mytime in timelist:
    time=objects.filter(time=mytime['time']).values_list('time',flat=True)[0]
    date=objects.filter(time=mytime['date']).values_list('date',flat=True)[0]
    date_time=objects.filter(time=mytime['date_time']).values_list('date_time',
    flat=True)[0]
    myobjects=objects.filter(time=mytime['time']) #to get all objects on each time
    mytime.update({'anyotherfield':myobjects,'date_time':date_time,
    'date':date,'time':time})
return render_to_response('report.html',locals())

На html-странице я пишу:

{%for mytime in timelist%}
<tr>
    <td>{{mytime.date_time}}</td>
    <td>{{mytime.date}}</td>
    <td>{{mytime.time}}</td>

    {%for object in mytime.anyotherfield%}
    <td>{{object.value1}}</td>
    <td>{{object.value1}}</td>
    {%endfor%}
</tr>
{%endfor%}

, чтобы я мог получить одну строку для каждого отдельного времени («date_time»), и в каждой строке я отображаю информацию о времени (одну и только одну для каждого временного поля) и конкретные значения полей для разных объектов на этом конкретном время.

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

myobjects.values_list () возвращает список значений Юникода, а не объектов. Если вам нужно дополнить значения значениями из вашего набора запросов, вы можете рассмотреть возможность возврата словаря значений вместо values_list ...

times = myobjects.values('time')

for mytime in times:
    mytime.update({'my_key' : myobjects.filter(time=mytime).values_list('value1',flat=true)})

Надеюсь, это поможет вам.

1 голос
/ 19 апреля 2011

Интересно, почему вы вообще передаете в шаблон сглаженный набор запросов (values_list)?

Как заметил Брэндон, вам было бы лучше, если бы вы поместили свои данные в диктовку:

myobjects=model.objects.all()
times=myobjects.values_list(‘time’, flat=True)

time_info = {}

for mytime in times:
    time_info[mytime] = myobjects.filter(time=mytime)

А потом в вашем шаблоне:

{% for time, myobjects in time_info.items %}
<h1>{{ time }}</h1>
<ul>
{% for myobject in myobjects %} 
    <li>{{ myobject.value }}</li> 
{% endfor %}
</ul>
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...