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 %}
이 ('tree.closed_levels') 중첩 잘못된 태그를 생성하기 때문에 그것은,하지 않습니다. – ohnoes