2009-03-04 4 views
1

Я использую templatetag MPTT для рендеринга моего жанрового дерева.Django 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; 

И попытался переопределить full_tree_for_model тег, чтобы сделать его использовать собственный менеджер, который просто добавляет дополнительный is_genre_branch_visible(genre_id) к QuerySet. Но что-то не так с заказом, не может понять это.

Plus Это работает, но мне не нравится подход, чувствующий себя уродливым для меня.

ответ

-1

Ну, простой

{% if genre.is_visible %} 

только внутри для петли Шоуда сделать трюк :)

+0

Это не будет, так как он будет генерировать недопустимые теги гнездящихся ('tree.closed_levels'). – ohnoes