2013-11-04 79 views
0

有關MPTT對象和{%recursetree%}模板標記的使用的此問題與this one有關。如何將自定義數據添加到用於recursetree模板標記的Django MPTT模型

我的Django模型:

from mptt.models import MPTTModel, TreeForeignKey 
class myModel(MPTTModel): 
    myIntA = models.IntegerField(default=0) 
    myParent = TreeForeignKey('self', null=True, blank=True, related_name='children') 

筆者認爲:

myModelList = myModel.objects.all() 
for i in range(len(myModelList)): 
    myModelList[i].myIntB = i 

return render(
    request, 
    'myApp/myTemplate.html', 
    Context(
     { 
      "myModels": myModelList, 
     } 
    ) 
) 

是上述法律?你可以看到我爲每個myModel對象添加了一個變量myIntB。 但是,當我嘗試在下面的模板中打印myIntB時,什麼也沒有顯示出來。

如何從模板訪問myIntB?這不是我爲這個模型定義的領域,也不是我想要的。我只是希望m​​yModel在渲染這個特定模板期間增加這個額外的變量。問題是,我還是看不到recursetree模板標籤。

我的模板:

{% load mptt_tags %} 
<ul> 
    {% recursetree nodes %} 
     <li> 
      {{node.id}} {{node.myIntA} {{node.myIntB}} 
      {% if not node.is_leaf_node %} 
       <ul> 
        {{ children }} 
       </ul> 
      {% endif %} 
     </li> 
    {% endrecursetree %} 
</ul> 

回答

0

的recursetree標籤要求.order_by您查詢集,if it's actually a queryset.

這會將查詢集,做另一個查詢並重新獲取數據庫中的所有對象。您的額外屬性不再存在於新對象上。

解決此問題的最簡單方法可能是在您將查詢集傳遞給recursetree之前調用list()。然後,mptt將假定排序已經完成,不會重新排序查詢集。

myModelList = list(myModel.objects.order_by('tree_id', 'lft')) 
for i, obj in enumerate(myModelList): 
    obj.myIntB = i 

return render(
    request, 
    'myApp/myTemplate.html', 
    Context({"myModels": myModelList}) 
) 
相關問題