![](/img/trans.png)
[英]Django mptt recursetree with get_cached_trees in template
[英]How to add custom data to Django MPTT model for recursetree template tag
有关MPTT对象和{%recursetree%}模板标签的用法的问题与此相关。
我的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>
如果recursetree标记实际上是一个查询集 , .order_by
在您的.order_by
上调用.order_by
。
这将复制查询集,执行另一个查询,然后从数据库中重新获取所有对象。 您的额外属性不再存在于新对象上。
解决此问题的最简单方法可能是在将queryset传递给recursetree
之前在queryset上调用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})
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.