有关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>
答案 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})
)