1

MPTT の templatetag を使用して、ジャンル ツリーをレンダリングしています。

   {% 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)です。しかし、順序に問題があり、実際にはこれを理解できません。

プラスそれは機能しますが、私はそのアプローチが好きではありません。私には醜く感じます。

4

1 に答える 1

-1

さて、シンプル

{% if genre.is_visible %}

forループのすぐ内側でトリックを実行します:)

于 2009-03-04T16:58:29.337 に答える