【问题标题】:How to add custom data to Django MPTT model for recursetree template tag如何为递归树模板标签添加自定义数据到 Django MPTT 模型
【发布时间】:2013-11-15 17:15:32
【问题描述】:

这个关于MPTT对象和{% recursettree %}模板标签使用的问题与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>

【问题讨论】:

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


    【解决方案1】:

    递归树标记在您的查询集上调用.order_by if it's actually a queryset.

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

    解决此问题的最简单方法可能是在您的查询集上调用 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})
    )
    

    【讨论】:

      猜你喜欢
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      相关资源
      最近更新 更多