最小化django-admin中的列表过滤器

时间:2011-05-22 07:32:31

标签: django django-admin django-admin-filters

我非常喜欢django管理员视图(list_filter)的过滤功能。

但是,对于有很多字段的视图,我真的希望能够通过点击来最小化/扩展它,以节省屏幕空间,还因为它有时实际上隐藏了东西。

是否有一种简单的方法可以添加折叠按钮(一些我已经找不到的插件或类似的插件)?

9 个答案:

答案 0 :(得分:12)

鉴于你现在在django admin中有jQuery,很容易将slideToggle()绑定到列表过滤器中的标题。

这似乎足以使Javascript工作:

// Fancier version https://gist.github.com/985283 

;(function($){ $(document).ready(function(){
    $('#changelist-filter').children('h3').each(function(){
        var $title = $(this);
        $title.click(function(){
            $title.next().slideToggle();
        });
    });   
  });
})(django.jQuery);

然后在ModelAdmin子类中激活,设置Media内部类:

class MyModelAdmin(admin.ModelAdmin):
  list_filter = ['bla', 'bleh']
  class Media:
    js = ['js/list_filter_collapse.js']

确保将list_filter_collapse.js文件放在STATIC_DIRS或STATIC_ROOT内的'js'文件夹中(取决于您的Django版本)

答案 1 :(得分:7)

我更改了Jj的答案,在点击“过滤器”标题时折叠整个过滤器,在此处添加完整性,有一个要点here

(function($){
ListFilterCollapsePrototype = {
    bindToggle: function(){
        var that = this;
        this.$filterTitle.click(function(){
            that.$filterContent.slideToggle();
            that.$list.toggleClass('filtered');
        });
    },
    init: function(filterEl) {
        this.$filterTitle = $(filterEl).children('h2');
        this.$filterContent = $(filterEl).children('h3, ul');
        $(this.$filterTitle).css('cursor', 'pointer');
        this.$list = $('#changelist');
        this.bindToggle();
    }
}
function ListFilterCollapse(filterEl) {
    this.init(filterEl);
}
ListFilterCollapse.prototype = ListFilterCollapsePrototype;

$(document).ready(function(){
    $('#changelist-filter').each(function(){
        var collapser = new ListFilterCollapse(this);
    });
});
})(django.jQuery);

答案 2 :(得分:7)

为此目的,我已在bitbucket上编写了一个可下载的小片段。

过滤器的状态存储在Cookie中,所选过滤器保持可见。

enter image description here

答案 3 :(得分:4)

感谢@JJ的想法。 我为整个窗口添加了切换,比@ abyx的工具更简单。

  1. 点击“过滤”标题
  2. 切换整个过滤器
  3. 点击列表标题
  4. 切换每个列表

    这是js文件内容:

    ;(function($){ $(document).ready(function(){
        $('#changelist-filter > h3').each(function(){
            var $title = $(this);
            $title.click(function(){
                $title.next().slideToggle();
            }); 
        });   
        var toggle_flag = true;
        $('#changelist-filter > h2').click(function () {
            toggle_flag = ! toggle_flag;
            $('#changelist-filter > ul').each(function(){
                    $(this).toggle(toggle_flag);
            }); 
        });   
      }); 
    })(django.jQuery);
    

答案 4 :(得分:1)

对此进行了另一项更改,以便在您单击顶部H2时隐藏H3以及过滤器列表。如果单击顶部的“过滤器”,这将使整个过滤器列表不受影响。

这是js文件内容

;(function($){ $(document).ready(function(){
    $('#changelist-filter > h3').each(function(){
        var $title = $(this);
        $title.click(function(){
            $title.next().slideToggle();
        });
    });
    var toggle_flag = true;
    $('#changelist-filter > h2').click(function () {
        toggle_flag = ! toggle_flag;
        $('#changelist-filter').find('> ul, > h3').each(function(){
                $(this).toggle(toggle_flag);
        });
    });
  });
})(django.jQuery);

答案 5 :(得分:1)

修改了fanlix解决方案:

  1. 将光标显示为悬停
  2. 上的指针
  3. 默认折叠
  4. 代码

    (function($){ $(document).ready(function(){
        $('#changelist-filter > h3').each(function(){
            var $title = $(this);
            $title.next().toggle();
            $title.css("cursor","pointer");
            $title.click(function(){
                $title.next().slideToggle();
            });
        });
        var toggle_flag = false;
        $('#changelist-filter > h2').css("cursor","pointer");
        $('#changelist-filter > h2').click(function () {
            toggle_flag = ! toggle_flag;
            $('#changelist-filter > ul').each(function(){
                $(this).slideToggle(toggle_flag);
            });
        });
      }); 
    })(django.jQuery);
    

答案 6 :(得分:1)

结合Tim和maGo的方法,进行了一些调整:

优点:

  • 允许用户隐藏整个列表(将“点击隐藏/取消隐藏”添加到过滤器列表标题,以便用户知道该怎么做)。
  • 默认维护折叠过滤器类别

缺点:

  • 选择过滤器后的页面刷新会导致过滤器类别再次折叠;理想情况下,与你合作的人会保持开放。

代码:

(function($){ $(document).ready(function(){

    // Start with a filter list showing only its h3 subtitles; clicking on any
    // displays that filter's content; clicking again collapses the list:
    $('#changelist-filter > h3').each(function(){
        var $title = $(this);
        $title.next().toggle();
        $title.css("cursor","pointer");
        $title.click(function(){
            $title.next().slideToggle();
        });
    });

    // Add help after title:
    $('#changelist-filter > h2').append("<span style='font-size: 80%; color: grey;'> (click to hide/unhide)</span>");

    // Make title clickable to hide entire filter:
    var toggle_flag = true;
    $('#changelist-filter > h2').click(function () {
        toggle_flag = ! toggle_flag;
        $('#changelist-filter').find('> h3').each(function(){
                $(this).toggle(toggle_flag);
        });
    });
  });
})(django.jQuery);

答案 7 :(得分:0)

我为菜单崩溃和单个元素菜单崩溃写了一个片段。

它是abyx代码的分支,我只是扩展了它。

如果先前已激活过滤器,则与此相关的元素菜单将从打开开始。

过滤器菜单默认开始关闭。 希望这有帮助

https://github.com/peppelinux/Django-snippets/tree/master/django-admin.js-snippets

答案 8 :(得分:0)

Giuseppe De Marco的摘录效果最好。因此,我在这里添加他的代码段以便于访问。它甚至解决了joelg上面讨论的问题(缺点):

// Copied from 
// https://github.com/peppelinux/Django-snippets/tree/master/django-admin.js-snippets

(function($){
    
    var element_2_collapse = '#changelist-filter';
    var element_head       = 'h2'
    var filter_title       = 'h3'
    
    // this is needed for full table resize after filter menu collapse
    var change_list        = '#changelist'
    
    
    ListFilterCollapsePrototype = {
        bindToggle: function(){
            var that = this;
            this.$filterTitle.click(function(){
                
                // check if some ul is collapsed
                // open it before slidetoggle all together
                $(element_2_collapse).children('ul').each(function(){
                    if($(this).is(":hidden"))
                        {
                            $(this).slideToggle();
                        }            
                })
                
                // and now slidetoggle all 
                that.$filterContentTitle.slideToggle();
                that.$filterContentElements.slideToggle();            
                that.$list.toggleClass('filtered');
    
            });
    
        },
        init: function(filterEl) {
            this.$filterTitle = $(filterEl).children(element_head);
            this.$filterContentTitle = $(filterEl).children(filter_title);
            this.$filterContentElements = $(filterEl).children('ul');
            $(this.$filterTitle).css('cursor', 'pointer');
            this.$list = $(change_list );
            
            // header collapse
            this.bindToggle();
        
            // collapsable childrens 
            $(element_2_collapse).children(filter_title).each(function(){
                var $title = $(this);
                $title.click(function(){
                    $title.next().slideToggle();
                            
                });
            
            $title.css('border-bottom', '1px solid grey');
            $title.css('padding-bottom', '5px');
            $title.css('cursor', 'pointer');     
            
            });
        
        
            
        }
    }
    function ListFilterCollapse(filterEl) {
        this.init(filterEl);
    }
    ListFilterCollapse.prototype = ListFilterCollapsePrototype;
    
    $(document).ready(function(){
        $(element_2_collapse).each(function(){
            var collapser = new ListFilterCollapse(this);
        });
        
        // close them by default
        $(element_2_collapse+' '+element_head).click()
        
        // if some filter was clicked it will be visible for first run only
        // selezione diverse da Default
        
    
        $(element_2_collapse).children(filter_title).each(function(){
            
            lis = $(this).next().children('li')
            lis.each(function(cnt) {
              if (cnt > 0)
               {
                if ($(this).hasClass('selected')) {
                    $(this).parent().slideDown(); 
                    $(this).parent().prev().slideDown();
                    
                    // if some filters is active every filters title (h3) 
                    // should be visible
                    $(element_2_collapse).children(filter_title).each(function(){
                        $(this).slideDown(); 
                    })
                    
                    $(change_list).toggleClass('filtered');
                    
                }
               }
            })
    
        });
    
    });
    })(django.jQuery);