Django:管理员list_filter太长

时间:2018-10-08 09:33:10

标签: django django-admin

我模型的change_list视图如下:

enter image description here

右侧的list_filter太长且无法使用。

是否有一种方法可以更有效地过滤Django的change_list视图?

3 个答案:

答案 0 :(得分:4)

您可以尝试将dal_admin_filters的Django自动完成式滤光片用于Django管理员

https://pypi.org/project/dal_admin_filters/

看起来可能正是您要寻找的

enter image description here

答案 1 :(得分:1)

虽然dal_admin_filters似乎可以正常使用,但它已经有一段时间没有更新(2017)了,并且早于Django 2.0引入了自动完成字段。

如果我是您,我会很幸运地根据Django 2.0和dal_admin_filters实现中公开的新自动完成端点来实现自己的SimpleListFilter subclass

答案 2 :(得分:0)

您可以尝试类似的方法。

注意:Gedas here的原始帖子

  1. 创建一个名为custom_filter.html的新模板
  2. 将以下代码复制到custom_filter.html中。我包括两个不同的版本-一个带有单选,另一个带有多选。

custom_filter_single.html

{% load i18n %}
<script type="text/javascript">
var go_from_select = function(opt) 
{ window.location = window.location.pathname + opt };
</script>
  <h3>{{ title }}</h3>
  <ul class="admin-filter-{{ title|cut:' ' }}">
  {% if choices|slice:"4:" %}
  <li>
  <select style="width: 95%;"
    onchange="go_from_select(this.options[this.selectedIndex].value)">
    {% for choice in choices %}
       <option{% if choice.selected %} selected="selected"{% endif %}
         value="{{ choice.query_string|iriencode }}">{{ choice.display }}
       </option>
    {% endfor %}
  </select>
  </li>
  {% else %}
  {% for choice in choices %}
    <li{% if choice.selected %} class="selected"{% endif %}>
      <a href="{{ choice.query_string|iriencode }}">{{ choice.display }}</a> 
    </li>
  {% endfor %}

  {% endif %}
  </ul>

custom_filter_multiple.html 使用select2 lib,可以对以下内容进行优化

{% load i18n %}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"> 
</script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6- 
rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6- 
rc.0/js/select2.min.js"></script>

<script>
   $(document).ready(function() {
    $("#personnel").select2();
    $("#personnel").change(function() {
    var selected_vals = $('#personnel').val();
    var selections = selected_vals.join().replace(/\?/g, '').replace(/\,/g, 
    '&');
    window.location = window.location.pathname + "?" +selections;
    });

  });
</script>
<h3>{{ title }}</h3>
<ul class="admin-filter-{{ title|cut:' ' }}">
{% if choices|slice:"4:" %}
  <li>
   <select style="width: 95%;" class="js-example-basic-multiple" 
    multiple="multiple" id="personnel">
   {% for choice in choices %}
   <option
      value="{{ choice.query_string|iriencode }}">{{ choice.display }}
   </option>
   {% endfor %}
   </select>
  </li>

  {% else %}
  {% for choice in choices %}
       <li{% if choice.selected %} class="selected"{% endif %}>
        <a href="{{ choice.query_string|iriencode }}">{{ choice.display }}</a> 
       </li>
  {% endfor %}

  {% endif %}
  </ul>
  1. 在filters.py中创建一个名为CustomFilter

    的新过滤器类 从django.contrib.admin.filters

    导入AllValuesFieldListFilter

    类CustomFilter(AllValuesFieldListFilter):     template ='admin / custom_filter_single.html'#使用适当的模板

  2. 现在像这样在admin.py中使用上面的过滤器类

    class SomeAdmin(admin.ModelAdmin):
        list_filter = (('personnel_type', CustomDropDownFilter),)
    #TIP: for custom filter labels, you can add verbose_name in 
    #models.py like this. 
    personnel_type = models.CharField(max_length=32, blank=True, 
                      verbose_name="By Personnel Type")
    

一些截图。

enter image description here

enter image description here