Как изменить фильтр администратора Django, чтобы использовать раскрывающийся список вместо списка? - PullRequest
35 голосов
/ 25 марта 2011

Если для поля, по которому вы хотите выполнить фильтрацию, у вас есть более ~ 10 значений, боковая панель фильтрации становится уродливой и трудной для использования.

Я ищу решение заменить <li> раскрывающимся списком (выпадающий список) или чем-то подобным, что решит ту же проблему.

Ответы [ 8 ]

31 голосов
/ 03 января 2014

Я не могу комментировать ответы, поэтому добавлю ответ beholderrk здесь.

  1. создайте новый шаблон с именем dropdown_filter.html или аналогичный
  2. скопируйте код filter.html изнапример, dropdown_filter.html
  3. создать новый класс фильтра в filters.py:

    from django.contrib.admin.filters import AllValuesFieldListFilter
    
    class DropdownFilter(AllValuesFieldListFilter):
        template = 'admin/dropdown_filter.html'
    
  4. Теперь вы можете использовать этот фильтр в своем классе администратора:

    class SomeAdmin(admin.ModelAdmin):
        # ...
        list_filter = (('country', DropdownFilter),)
    

Отлично работает!

29 голосов
/ 21 сентября 2016

Спасибо @beholderrk, @gedas и @ jk-laiho! Я упаковал это в многоразовое приложение .

Установка:

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

28 голосов
/ 30 ноября 2011

Использовать filter.html из feincms

{% 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>
3 голосов
/ 25 марта 2011

Простой вариант - использовать django-grappelli , который заменяет все фильтры выпадающими списками.

2 голосов
/ 14 июля 2017

http://djangosuit.com/ также предлагает выпадающие списки фильтров.

2 голосов
/ 25 марта 2011

Вы можете скопировать административные шаблоны из установки 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>
    
0 голосов
/ 23 сентября 2018

Не могли бы вы привести полный пример.это показывает как раньше.вот мой код

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

0 голосов
/ 20 декабря 2016

Лучшее решение - создать новый шаблон в admin/filter.html и внедрить HTML-код, предложенный @beholderrk.Просто реализовал это для клиента, и он прекрасно работает.

Проблема с DropdownFilter and RelatedDropdownFilter заключается в том, что он теряет надлежащий дисплей.Вместо переведенных строк для Charfield(choices=xxx) будет отображаться True, False и т. Д.

...