如何更改Django管理过滤器以使用下拉列表而不是列表?

时间:2011-03-25 06:30:47

标签: django django-admin

如果对于要过滤的字段,您有超过10个值,则过滤侧边栏开始变得丑陋且难以使用。

我正在寻找一种解决方案,用下拉选项(组合框)或类似的东西替换<li>,以解决同样的问题。

10 个答案:

答案 0 :(得分:30)

我无法评论答案,所以我会在这里添加beholderrk的答案。

  1. 创建一个名为dropdown_filter.html或类似
  2. 的新模板
  3. 将filter.html的代码从feincms复制到dropdown_filter.html
  4. filters.py中创建一个新的过滤器类:

    from django.contrib.admin.filters import AllValuesFieldListFilter
    
    class DropdownFilter(AllValuesFieldListFilter):
        template = 'admin/dropdown_filter.html'
    
  5. 现在您可以在管理员类中使用此过滤器:

    class SomeAdmin(admin.ModelAdmin):
        # ...
        list_filter = (('country', DropdownFilter),)
    
  6. 效果很好!

答案 1 :(得分:28)

使用来自feincms的filter.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>

答案 2 :(得分:28)

谢谢@beholderrk,@ gedas和@ jk-laiho!我将其打包成reusable app

安装:

pip install django-admin-list-filter-dropdown

settings.py中启用:

INSTALLED_APPS = (
    ...
    'django_admin_listfilter_dropdown',
    ...
)

admin.py中使用:

from django_admin_listfilter_dropdown.filters import (
    DropdownFilter, ChoiceDropdownFilter, RelatedDropdownFilter
)

class EntityAdmin(admin.ModelAdmin):
    ...
    list_filter = (
        # for ordinary fields
        ('a_charfield', DropdownFilter),
        # for choice fields
        ('a_choicefield', ChoiceDropdownFilter),
        # for related fields
        ('a_foreignkey_field', RelatedDropdownFilter),
    )

这是它的样子:

Screenshot of dropdown list filter

答案 3 :(得分:3)

一个简单的选择是使用django-grappelli,它将所有过滤器替换为下拉列表。

答案 4 :(得分:2)

您可以将django安装中的管理模板复制到项目中的templates / admin文件夹中。

然后,您需要在要显示输出的表单或模板中执行以下任何操作:

  1. 如果您正在使用表单,您希望将列表选项发布回数据库,您可以在model.py中,在您可以选择的字段上输入一些像这样:

    choice = forms.IntegerField(widget=forms.Select(choices=CHOICES))
    
  2. 如果只是要在页面上显示,那么您将在模板标签上输出如下内容:

    <select>
      {% for choices in object.details.all %}
        <option> {{ object.choice }} </option>
      {% endfor %}
    </select>
    

答案 5 :(得分:2)

http://djangosuit.com/还提供了列表过滤器的下拉列表。

答案 6 :(得分:0)

最佳解决方案是在@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ super.onCreateOptionsMenu(menu, inflater); final SwitchCompat switch1= (SwitchCompat) menu.findItem(R.id.switch_wifi).getActionView().findViewById(R.id.switchForActionBar); switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked){ fab.setVisibility(View.VISIBLE); } else{ fab.setVisibility(View.GONE); } } }); 中创建一个新模板,并实现@beholderrk建议的HTML代码。刚刚为客户实现它,它工作得很好。

admin/filter.html的问题在于它失去了正确的显示。它将显示DropdownFilter and RelatedDropdownFilterCharfield(choices=xxx)等,而不是True的翻译字符串。

答案 7 :(得分:0)

能否请您举一个完整的例子。它像以前一样显示。 这是我的代码

from django.contrib import admin
from pages.models import Post, Device, DeviceType, DeviceModel, Ipaddress, DeviceGroup, Location,Department,Comment
from django_admin_listfilter_dropdown.filters import DropdownFilter, RelatedDropdownFilter


class CommentInline(admin.TabularInline):
    model = Comment

class IpaddressAdmin(admin.ModelAdmin):
        prepopulated_fields = {'slug': ('ipaddress',)}
#        model=Ipaddress

        search_fields = ['ipaddress', ]
#     
        list_display = ('ipaddress', 'machinename', 'user', 'department','location',)
        list_filter = (
        ('user', DropdownFilter),
        ('department', RelatedDropdownFilter),
        ('location', RelatedDropdownFilter),

    )

这是屏幕截图enter image description here

答案 8 :(得分:0)

‍django_admin_listfilter_dropdown‍的效果很好,但是似乎我们无法将其与‍‍‍‍ admin.RelatedOnlyFieldListFilter一起使用(从现有值中获取动态过滤器列表)。

这是一种使用方式吗?我尝试了一些语法:

('specialty', RelatedDropdownFilter, admin.RelatedOnlyFieldListFilter),

(('specialty', RelatedDropdownFilter), admin.RelatedOnlyFieldListFilter),

...

但没有成功。

答案 9 :(得分:-1)

我不喜欢到目前为止提供的所有解决方案。

为什么?如果对于要作为筛选依据的字段,您有10个以上的值,则列表视图框也不是那么方便。我建议使用django admin的标准搜索字段功能,该功能将向您显示搜索字段:

class BooksAdmin(admin.ModelAdmin):
    list_display = ('ISBN', 'title')         
    search_fields = ('ISBN',)
    # instead of: list_filter = ('ISBN',)
    ordering = ('title',)