2011-04-14 118 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