3 votes

L'objet 'unicode' n'a pas d'attribut 'value1'.

Si j'ai une liste d'objets dans views.py, comme par exemple :

myobjects=model.objects.all()

puis j'obtiens les valeurs d'un champ des objets :

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

et je veux ensuite attribuer un attribut à chaque objet de la liste :

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)

et utiliser l'attribut dans le fichier html du modèle en utilisant :

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

Je reçois une erreur : l'objet 'unicode' n'a pas d'attribut 'value1' (Note : bien sûr aussi value2). Dois-je faire quelque chose d'autre pour définir l'attribut de l'objet mytime ? Je pensais que object.attribute=value était suffisant pour définir l'attribut ici. Merci de votre compréhension.

Solution : J'ai résolu mon problème en utilisant les codes ci-dessous :

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

Dans la page html, j'écris

{%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%}

afin d'obtenir une ligne pour chaque heure différente ('date_time'), et d'afficher dans chaque ligne les informations relatives à l'heure (une et une seule pour chaque champ temporel) et les valeurs des champs spécifiques pour les différents objets à cette heure précise.

3voto

Brandon Points 11873

Myobjects.values_list() renvoie une liste de valeurs unicode, pas des objets. Si vous avez besoin d'augmenter les valeurs avec des valeurs de votre queryset, vous pourriez envisager de retourner un dictionnaire de valeurs au lieu de la liste values_list...

times = myobjects.values('time')

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

J'espère que cela vous aidera.

1voto

arie Points 8860

Je me demande pourquoi vous passez un queryset aplati ( values_list ) au modèle ?

Comme Brandon l'a mentionné, il serait préférable que vous placiez vos données dans un fichier :

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

time_info = {}

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

Puis dans votre modèle :

{% for time, myobjects in time_info.items %}
<h1>{{ time }}</h1>
<ul>
{% for myobject in myobjects %} 
    <li>{{ myobject.value }}</li> 
{% endfor %}
</ul>
{% endfor %}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X