Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Я не могу комментировать ответы, поэтому я добавлю к запросу 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),)
    

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

Ответ 2

Использовать 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

Спасибо @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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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