2013-11-04 88 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}) 
) 
相关问题