2012-03-18 3 views
1

트리 비어드 모델에서 디렉토리 트리를 표시하려고합니다. treebeard 튜토리얼에서 제안 된 주석이 달린 목록 메서드는 잘 작동하지만 데이터 트리에 ID 정보를 포함하고 싶습니다.django_treebeard를 사용하여 데이터 트리 (node.id 포함)를 만듭니다.

dump_bulk()에는 필요한 모든 정보가 있지만 파이썬과 장고 초보자로서 저는 정보를 추출하여 템플릿에 표시하는 방법을 찾기 위해 애 쓰고 있습니다.

자바 스크립트로 전환하는 것에 대해 생각해 봤지만 json 문자열을 구문 분석했지만 자바 스크립트는 문자열 값 앞에 u 접두사가 맘에 들지 않습니다. u 접두사를 피하는 간단한 방법이 있습니까?

나는 또한 id 정보를 포함하는 get_annotated_list()에 기반한 함수를 작성하려고 생각했다. id 정보가 포함되도록 get_annotated_ 목록을 오버로드 할 수 있어야한다고 가정하고 있지만 그 중 하나를 다루는 방법이 너무 명확하지 않습니다.

학습 곡선을 따라 진행하는 데 도움이되는 모든 제안 사항에 감사드립니다.

답변

0

아마도 get_annotated_list()은 튜플 배열을 (node, info) 형태로 반환합니다. info은 사전 일 뿐이므로 목록을 반복하고 원하는 추가 키 쌍을 추가 할 수 있습니다. 예 :

for node, info in my_annotated_list: 
    info['foo'] = node.id 

템플릿에이 값을 전달하면됩니다.

발전기를 사용할 수도 있습니다. 나는 문제의 노드가 잎인지 추가 정보로 추가 해요, 여기에

def annotated_menu_items(initial_header, menu_items): 
    headings = [initial_header] 
    for item, info in menu_items: 

     yield item, info, item.is_leaf(), headings[-1:][0] 

     if info['open']: 
      headings.append(item.title) 

     for close in info['close']: 
      headings.pop() 

및에 가장 최근에 열었던 노드에서 제목을 밀어 : 이것은 내가 지금 일하고 있어요 프로젝트에서입니다 스택을 사용하여 트리의 더 깊은 레벨에서 액세스 할 수 있습니다.

당신은 파이썬을 처음 사용한다고 말하면 발전기를 읽을 수 있습니다. 그것들은 (잠재적으로 무한한) 목록의 요소를 느리게 구체화합니다. 이를 사용하려면 생성자를 생성하는 함수를 호출하면 생성자 객체를 iterable으로 처리 할 수 ​​있습니다. 예 :

my_fancy_menus = annotated_menu_items("My Menu", my_annotated_list) 

for menu in my_fancy_menus: 
    do_stuff(menu) 

발전기를 장고 템플릿에 전달하여 목록처럼 처리 할 수도 있습니다.