Я использую 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 Это работает, но мне не нравится подход, чувствующий себя уродливым для меня.
Это не будет, так как он будет генерировать недопустимые теги гнездящихся ('tree.closed_levels'). – ohnoes