模型对象不可迭代

时间:2013-01-22 07:36:29

标签: django

template.html

{% extends "base.html" %}

<body>
{% block content %}

<form action="." method="post">
{% csrf_token %}


<table align="center" style="margin-left:60px";>

        <p>{{KEBReading_form.as_table}}</p>
<tr><td colspan="2" align="right"><input name="KEBsubmit" type="submit" value="Submit Reading" id="_KEBsubmit1"/> </td></tr>
    <tr><td colspan="2" >{{KEBMessage}} </td></tr>
</table>
</form>


<table border="1">
<p> KEB Reading as on Month jan and year 2012</p>
<tr>
<th>Date </th>
<th>Time</th>
<th>True Power Reading</th>
<th>Apparent Power Reading</th>
<th>True Power consumed</th>
<th>Voltage Reading</th>
<th>Power Factor</th>
 </tr>



{% for item in q2 %}
 <tr>
 <td>{{item.date}}</td>
 <td>{{item.time}}</td>
 <td>{{item.truepower_reading}}</td>
 <td>{{item.apparentpower_reading}}</td>
  <td>{{item.truepower_consumed}}</td>
  <td>{{item.voltage_reading}}</td>
    <td> {{item.powerfactor}}</td>
 </tr>
 {% endfor %}

 </table>

{%endblock content%}

views.py

 def KEBReading1(request):
#form2 = KEBReading.objects.all()
if request.method == "POST":


    form = KEBReading_form(request.POST)
    if form.is_valid():
        prevdate=KEBReading.objects.latest("date")
       # Model.objects.latest('field')
        print prevdate.date
        print prevdate.time
        # q1 = KEBReading.objects.get(datetime.date.today()-datetime.timedelta(0))

        kr_truepower_reading = form.cleaned_data["truepower_reading"]
        kr_apparentpower_reading = form.cleaned_data["apparentpower_reading"]
        truepower_consumed1=kr_truepower_reading-prevdate.truepower_reading
        powerfactor1=((kr_truepower_reading-prevdate.truepower_reading)/(kr_apparentpower_reading-prevdate.apparentpower_reading))
        #instance=truepower_consumed,powerfactor
  ## replace form.save() with following lines



        form1=form.save(commit=False)
        #form1.calculate(truepower_consumed1,powerfactor1)
        form1.truepower_consumed=truepower_consumed1
        form1.powerfactor=powerfactor1
        print form1.powerfactor
        form1.save()



        q2=KEBReading.objects.latest("date")

        context={'KEBReading_form':form,'q2':q2}
        return render_to_response('keb.html',context,context_instance=RequestContext(request))

else:
    form = KEBReading_form()

return render_to_response('keb.html',{'KEBReading_form':form},context_instance=RequestContext(request))

我想在表格中显示所有读数,我通过模板中的视图计算出来。我使用for循环迭代时得到的模型对象不可迭代..

3 个答案:

答案 0 :(得分:0)

您的q2变量只是一个对象而非一组。

以下行返回单个对象 -

KEBReading.objects.latest("date")

但是你的模板期待一个可以迭代的集合 -

{% for item in q2 %}
 <tr>
 <td>{{item.date}}</td>
 <td>{{item.time}}</td>
 <td>{{item.truepower_reading}}</td>
 <td>{{item.apparentpower_reading}}</td>
  <td>{{item.truepower_consumed}}</td>
  <td>{{item.voltage_reading}}</td>
    <td> {{item.powerfactor}}</td>
 </tr>
 {% endfor %}

检查latest()功能的docs

答案 1 :(得分:0)

latest()返回表中的最新对象,而不是一组对象。而不是那样,你应该使用KEBReading.objects.all().order_by('date')

答案 2 :(得分:0)

一些问题:

  1. 首先,由于Aidan正确地注意到KEBReading.objects.latest("date"),这将返回一个对象,而不是一个集合或可迭代的对象。

  2. 其次,您没有指定要在视图中计算的任何字段。 truepower_consumed1=kr_truepower_reading-prevdate.truepower_reading不会将其分配给您检索到的对象(q2)。我不确定这是否是故意的。但是,我怀疑你想要将模板的实例返回给你的模板,而不是从表中返回另一条记录。您需要更新您的问题。

  3. 立即解决这些问题:

     <tr>
     <td>{{q2.date}}</td>
     <td>{{q2.time}}</td>
     <td>{{q2.truepower_reading}}</td>
     <td>{{q2.apparentpower_reading}}</td>
     <td>{{q2.truepower_consumed}}</td>
     <td>{{q2.voltage_reading}}</td>
     <td> {{q2.powerfactor}}</td>
     </tr>