【问题标题】:Django MPTT - tree filteringDjango MPTT - 树过滤
【发布时间】:2010-10-11 06:14:02
【问题描述】:

我正在使用 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) 添加到查询集。 但是排序出了点问题,实在想不通。

Plus 可以,但我不喜欢这种方法,我觉得很难看。

【问题讨论】:

    标签: django tree django-templates plpgsql django-mptt


    【解决方案1】:

    嗯,简单的

    {% if genre.is_visible %}
    

    就在 for 循环内部应该做的伎俩:)

    【讨论】:

    • 不会,因为它会生成无效标签嵌套 (tree.closed_levels)。
    猜你喜欢
    • 2012-09-04
    • 2012-10-13
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多