2013-11-04 1 views
0

MPTT 오브젝트 및 {% recursetree %} 템플릿 태그 사용에 대한이 질문은 this one과 관련됩니다.recursetree 템플릿 태그 용 Django MPTT 모델에 사용자 정의 데이터를 추가하는 방법

내 장고 모델 :

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

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}) 
) 
관련 문제