2009-03-04 3 views
1

나는 장르 트리 렌더링에 MPTT의 templatetag를 사용하고 있습니다.장고 MPTT - 트리 필터링

것은이
{% for genre, structure in genres|tree_info %} 
     {% if tree.new_level %}<ul><li>{% else %}</li><li>{% endif %} 
     {{ genre.name }} 
     {% for level in tree.closed_levels %}</li></ul>{% endfor %} 
    {% endfor %} 

, 내 genre 목적은 존중되어야 is_visible 속성이 있습니다.

def is_visible(self): 
     if self.is_root_node() or not self.visibility: 
      return self.visibility       
     for parent in self.get_ancestors(): 
      if not parent.visibility:  
       return False          
     return True 

무엇을 가장 효율적으로 수행 할 수 있습니까?


추가 정보

나는 제대로 생산 될 수있는 (X) HTML 목록 중첩이 필요합니다. 상속 된 가시성 검사를위한 SQL 함수를 정의했습니다.

CREATE OR REPLACE function get_genre_parent_id(_genre_id int) 
RETURNS INTEGER AS $$ 
DECLARE 
    _parent_id INTEGER; 
    _genre_id ALIAS FOR $1;  
BEGIN 
    SELECT parent_id INTO _parent_id 
    FROM product_productgenre 
    WHERE id = _genre_id; 

    RETURN _parent_id; 

END; 
$$ LANGUAGE plpgsql; 


CREATE OR REPLACE function is_genre_visible(_genre_id int) 
RETURNS BOOLEAN AS $$ 
DECLARE 
    _visible BOOLEAN; 
    _genre_id ALIAS FOR $1;  
BEGIN 
    SELECT visibility INTO _visible 
    FROM product_productgenre 
    WHERE id = _genre_id; 

    RETURN _visible; 

END; 
$$ LANGUAGE plpgsql; 


CREATE OR REPLACE function is_genre_branch_visible(_genre_id int) 
RETURNS BOOLEAN AS $$ 
DECLARE 
    visible BOOLEAN; 
    _genre_id ALIAS FOR $1; 
    _temp_genre_id INTEGER; 
BEGIN 
    visible = true; 
    _temp_genre_id := _genre_id; 
    -- checking for our own genre 
    IF NOT is_genre_visible(_temp_genre_id) THEN 
     RETURN false; 
    END IF; 
    -- iterating through all parent genres 
    WHILE get_genre_parent_id(_temp_genre_id) IS NOT NULL LOOP 
     _temp_genre_id = get_genre_parent_id(_temp_genre_id); 
     IF NOT is_genre_visible(_temp_genre_id) THEN 
      RETURN false; 
     END IF; 
    END LOOP; 

    RETURN visible; 

END; 
$$ LANGUAGE plpgsql; 

은 그리고 단순히 검색어 세트에 추가 is_genre_branch_visible(genre_id)을 추가하는 사용자 정의 관리자를 사용할 수 있도록하기 위해 full_tree_for_model 태그를 무시하려고 노력했다. 하지만 주문에 문제가있어 실제로이를 파악할 수는 없습니다.

플러스 그래도 작동하지만, 나에게보기 싫어. 단지 내부에 간단한

{% if genre.is_visible %} 

답변

-1

음, 트릭을 할 갈까요 루프에 대한 :)

+0

이 ('tree.closed_levels') 중첩 잘못된 태그를 생성하기 때문에 그것은,하지 않습니다. – ohnoes