如何将自定义数据添加到Django MPTT模型中以获得recursetree模板标记

时间:2013-11-04 22:42:25

标签: python django templates django-templates django-mptt

有关MPTT对象和{%recursetree%}模板标记用法的问题与this one有关。

我的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?它不是我为此模型定义的字段,也不是我想要的字段。我只是希望在呈现此特定模板期间使用此额外变量扩充myModel。问题是我无法使用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>

1 个答案:

答案 0 :(得分:0)

recursetree标记会在您的查询集if it's actually a queryset.

上调用.order_by

这将复制查询集,执行另一个查询并从数据库中重新获取所有对象。您的额外属性不再存在于新对象上。

解决此问题的最简单方法可能是在将查询集传递给list()之前调用recursetree。然后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})
)