Как изменить фильтр администратора Django, чтобы использовать раскрывающийся список вместо списка?
Если для поля, которое вы хотите фильтровать, у вас больше, чем ~ 10 значений, боковая панель фильтрации становится уродливой и сложной в использовании.
Я ищу решение для замены <li>
выпадающим списком (combobox) или чем-то подобным, которое решит ту же проблему.
Ответы
Ответ 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]()