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

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

Я ищу решение для замены

  • выпадающим списком (combobox) или чем-то подобным, которое решит ту же проблему.
  • 7 ответов

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

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

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

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

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


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

    {% load i18n %}
    
    <h3>{{ title }}</h3>
    <ul>
    {% if choices|slice:"4:" %}
     <li>
     <select style="width: 95%;" onchange="go_from_select(this.options[this.selectedIndex].value)">
     {% for choice in choices %}
     {{ choice.display }}
     {% endfor %}
     </select>
     </li>
    {% else %}
     {% for choice in choices %}
     <li{% if="" choice.selected="" %}="" {%="" endif="">
     <a href="{{ choice.query_string|iriencode }}">{{ choice.display }}</a>
     {% endfor %}
    {% endif %}
    </li{%></ul>


    Спасибо @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, RelatedDropdownFilter
    class EntityAdmin(admin.ModelAdmin):
     ...
     list_filter = (
     # for ordinary fields
     ('a_charfield', DropdownFilter),
     # for related fields
     ('a_foreignkey_field', RelatedDropdownFilter),
     )

    Вот как это выглядит:


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


    Вы можете скопировать шаблоны администратора из установки django в папку templates/admin в вашем проекте.

    Затем вам нужно будет сделать любую из двух вещей в формах или шаблонах, которые вы хотите показать в выводе:

    • Если вы работаете с формой, в которой вы хотели бы, чтобы список вариантов был отправлен обратно в базу данных, вы бы указали в своем model.py, на поле у ​​вас есть выбор, добавьте некоторые из этих например:

      choice = forms.IntegerField(widget=forms.Select(choices=CHOICES))
    • Если это просто для отображения на странице, вы будете выводить на тег шаблона что-то вроде этого:

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


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


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

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

    licensed under cc by-sa 3.0 with attribution.