2011-04-14 71 views
1

在Django的项目,我想显示这样的报告:如何迭代对象的字段值?

Heading:  Field1   Field2  Field3 of Type A Field3 of Type B 
Data:   Record1Value1 Record1Value2 Record1Value3 
       Record2Value1 Record2Value2     Record2Value3 
       Record3Value1 Record3Value2 Record3Value3 

其中Record1Value1和Record2Value1,Record3Value1属于值1的列表。它是模型中对象的字段值列表。与列表值2相同。 Record1Value3和Record3Value3属于值列表3,但按type ='type A'进行过滤。 Record2Value3属于值列表3,按type ='type B'进行过滤。所以在我的views.py我的代码如下图所示:

objects=model.objects.filter(field=input,…) 
values1=objects.values_list(field1, flat=True) 
values2=objects.values_list(field2, flat=True) 
objects3a= objects.filter(type=’type A’) 
objects3b= objects.filter(type=’type B’) 
values3a=objects3a.values_list(field3, flat=True) 
values3b=objects3b.values_list(field3, flat=True) 
functions=objects.values_list(type,flat=True) 

在HTML页面中,我用下面的代码:

<th> 
<td> field1</td> <td> field2</td> <td> field3 of type A</td> <td>field3 of typeB </td> 
</th> 
{%for value1 in values1%} 
{%for value2 in values2%} 
{%for value3a in values3a%} 
{%for value3b in values3b%} 

<tr> 
<td> {{value1}}</td> <td> {{value2}}</td> 
<td> 
{%if function==’type A’%} 
{{value3a}} 
{%endif%} 
</td> 
<td> 
{%if function==’type B’%} 
{{value3b}} 
{%endif%} 
</td> 
</tr> 
{%endfor%} 
{%endfor%} 
{%endfor%} 
{%endfor%} 

我想要做的是叠代的每个记录,并把现场值,但对于field3,如果记录的'type'字段为'type A',则将field3值放入'A类型的字段3'列中,并将'B类型的字段3'留空。反之亦然类型B.

问题是,它不是真的以这种方式遍历每条记录。代码块:

{%if function==’type A’%} 
{{value3a}} 
{%endif%} 

实际上并不工作,因为它无法识别函数和value3a属于同一个对象:objects3a。我必须写一个forms.py来做到这一点吗?如果是这样,怎么样? (请注意,我不能在forms.py中声明对象,因为我必须在views.py中获得用户输入)。

此外,有没有什么办法来简化代码?这些许多事情使得加载数据几乎是不可能的。

希望有人能帮助我!

+0

你现在什么是嵌套循环。您应该重新构建模型,以便查看与您试图向用户展示的视图相匹配的数据库。然后,您可以简单地遍历该视图并访问字段。总之,在后台进行繁重的工作,保持模板简单。 – 2011-04-14 02:21:43

+0

我不认为我可以更改models.py中的数据,因为我根据数据库中的数据在模型中声明了字段。另外,我必须在views.py中获取用户输入,然后使用该数据获取queryset。你能举个例子吗? – widget 2011-04-14 03:42:33

回答

1

如果没有模型实现的所有细节,很难说,但您应该能够将objects结果直接传递给您的模板并在此处使用。

这里的想法:

<th> 
<td> field1</td> <td> field2</td> <td> field3 of type A</td> <td>field3 of typeB </td> 
</th> 
{%for object in objects %} 

<tr> 
<td> {{object.field1}}</td> <td> {{object.field2}}</td> 
<td> 
{%if object.type==’type A’%} 
{{object.field3}} 
{%endif%} 
</td> 
<td> 
{%if object.type==’type B’%} 
{{object.field3}} 
{%endif%} 
</td> 
</tr> 
{%endfor%} 
+0

辉煌!它看起来非常简单,但我没有想到我可以直接访问对象的字段。它完美地解决了我的问题。另外,因为字段的某些数据有换行符,所以我使用'{%if'在object.type%}中输入A'而不是'{%if object.type ='type A'%}'。问题解决了。谢谢 – widget 2011-04-14 19:44:42