list_filter множественный выбор

136 views
Skip to first unread message

Евгений Марьев

unread,
Nov 16, 2018, 10:15:46 AM11/16/18
to Django russian
Привет всем, возникла необходимость сделать фильтры в админке с множественной фильтрацией. В admin.py добавил класс  для переопределения фильтра, но никак не могу разобраться как добавить тег select атрибут multiple
class ServicesListFilter(admin.SimpleListFilter):
    """
    переопределяем фильтр для услуг
    """

    title = 'Услуги'
    parameter_name = 'services_ids'
    template = 'admin/custom_filter.html'

    def lookups(self, request, model_admin):
        """
        возвращаем все услуги для тега селект
        """
        # list_of_services = []
        services = Service.objects.all()
        for service in services:
            yield (str(service.id), service.title)
        #     list_of_services.append(
        #         (str(service.id), service.title)
        #     )
        #
        # return sorted(list_of_services, key=lambda tp: tp[1])

    def queryset(self, request, queryset):
        """
        выполняем фильтрацию типа WHERE IN ()
        """
        if self.value():
            return queryset.filter(services__in=self.value().split(","))
        return queryset


Денис Латыпов

unread,
Nov 16, 2018, 5:31:52 PM11/16/18
to django-...@googlegroups.com
Джанго не начинал еще сам помочь не смогу, но по поиску"тег select атрибут multiple django" нашел, посмотри тут, может поможет

пт, 16 нояб. 2018 г. в 18:15, Евгений Марьев <kadr...@gmail.com>:
--
Вы получили это сообщение, поскольку подписаны на группу "Django russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес django-russia...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--

Олег Комков

unread,
Nov 17, 2018, 7:45:26 AM11/17/18
to django-...@googlegroups.com
Не понимаю в чем у вас затруднение. Вы правильно унаследовались. Переопределили шаблон. Ну и выводите теперь в нем свой select. Придется только его в форму обернуть с method get и кнопку добавить для отправки или скрипт, чтобы автоматом отправлять на клике по опции. Еще придется переопределить метод def choices(self, changelist) и вылавливать из строки параметров все значения

Евгений Марьев

unread,
Nov 19, 2018, 9:56:42 AM11/19/18
to Django russian
Вот мой шаблон admin/custom_filter.html:
{% load i18n %}
<script type="text/javascript">
    var go_from_select = function(opt) { window.location = window.location.pathname + opt };
</script>
<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3>
<ul class="changelist-filter-select select2-hidden-accessible">
    <li>
    <select style="width: 95%;" multiple="multiple"  onblur="go_from_select(this.options[this.selectedIndex].value)">
    {% for choice in lookups %}
        {{ choice.display }}
        <option{% if choice.selected %} selected="selected"{% endif %}
         value="{{ choice.query_string|iriencode }}">{{ choice.display }}</option>
    {% endfor %}
    </select>
    </li>
</ul>



Проблема в том, что мой селект игнорируется, даже если его удалить, селект все равно появляется на страничке, а вот если удалить тег li, то и селект пропадает. Вопрос как же мне запихнуть свой селект в шаблон?

суббота, 17 ноября 2018 г., 16:45:26 UTC+4 пользователь PooH написал:

Grigory Fateyev

unread,
Nov 19, 2018, 10:23:22 AM11/19/18
to django-...@googlegroups.com
Точного ответа не знаю, но бросилось в глаза, тег li должен быть один на строку, те засуньте его в итератор.

пн, 19 нояб. 2018 г. в 17:56, Евгений Марьев <kadr...@gmail.com>:
--

Олег Комков

unread,
Nov 19, 2018, 9:04:44 PM11/19/18
to django-...@googlegroups.com
Если я правильно понял, то класс select2-hidden-accessible означает, что используется вот это https://select2.org/, тогда нужно смотреть по нему доку и делать нужную ему разметку.

ЗЫ:Если выложите минимальный проект с вашим компонентом, чтобы только поднять зависимости и запустить, то могу посмотреть, а так, извините, лень.

пн, 19 нояб. 2018 г. в 21:56, Евгений Марьев <kadr...@gmail.com>:
--
Message has been deleted
Message has been deleted

Евгений Марьев

unread,
Nov 20, 2018, 6:20:38 AM11/20/18
to Django russian
хотел скинуть проект, а сообщение удалили
сделал, что бы можно было выбирать несколько вариантов, но теперь не отрабатывает событие, которые было на изменение селекта, ну и не мудрено, теперь нужно добавить кнопку, как её добавить не знаю,  пытаюсь в этом же шаблон добавить её, на выходе полный игнор, не появляется на страничке.
фильтрация через адресную строку ?services__id__in=2,3,4 работает.
Вроде дело за малым, добавить кнопку и сделать, что бы выбранные услуги отображались в фильтре после перезагрузки страницы.

пятница, 16 ноября 2018 г., 19:15:46 UTC+4 пользователь Евгений Марьев написал:

Олег Комков

unread,
Nov 20, 2018, 8:39:41 PM11/20/18
to django-...@googlegroups.com

хотел скинуть проект, а сообщение удалили
можно положить на гитхаб или битбакет и ссылку сюда 
сделал, что бы можно было выбирать несколько вариантов, но теперь не отрабатывает событие, которые было на изменение селекта, ну и не мудрено, теперь нужно добавить кнопку, как её добавить не знаю,  пытаюсь в этом же шаблон добавить её, на выходе полный игнор, не появляется на страничке.

там у компонента селект2 должны быть события/калбеки на выбор можно на них повесить. 
Message has been deleted
Message has been deleted
Message has been deleted

Евгений Марьев

unread,
Nov 21, 2018, 12:57:36 AM11/21/18
to Django russian


пятница, 16 ноября 2018 г., 19:15:46 UTC+4 пользователь Евгений Марьев написал:
Привет всем, возникла необходимость сделать фильтры в админке с множественной фильтрацией. В admin.py добавил класс  для переопределения фильтра, но никак не могу разобраться как добавить тег select атрибут multiple

Олег Комков

unread,
Nov 21, 2018, 6:43:58 AM11/21/18
to django-...@googlegroups.com
{% load i18n %}<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3>
<ul class="js-example-basic-multiple"
multiple="multiple"
data-placeholder="Услуги">
{% for choice in choices %}
<li>
<a href="{{ choice.query_string|iriencode }}"
title="{{ choice.display }}">{{ choice.display }}</a>
</li>
{% endfor %}
</ul>

<script>
// Лучше добаваить в элемент id делать привязку по нему
jQuery(function () { jQuery('.js-example-basic-multiple').on('select2:select', function (e) {
    var data = jQuery(e.target).select2("val");
    console.log('e', data);     // Здесь устанавливайте нужный window.location
});
});
</script>

ср, 21 нояб. 2018 г. в 12:57, Евгений Марьев <kadr...@gmail.com>:

Олег Комков

unread,
Nov 21, 2018, 6:48:46 AM11/21/18
to django-...@googlegroups.com
Вдогонку исправление, не то событие воткнул 'change.select2'
jQuery('.js-example-basic-multiple').on('change.select2'

ср, 21 нояб. 2018 г. в 18:43, Олег Комков <oko...@gmail.com>:

Евгений Марьев

unread,
Nov 22, 2018, 2:12:43 AM11/22/18
to Django russian
Благодарю, так в принципе работает, почти как надо, за исключением одного косяка, при выборе услуг все фильтруется, а вот при удалении услуг из селекта, вместо удаления, происходит добавление этой же услуги.
То есть допустим выбрано: Веб-разработка и SMM, что соответствует запросу http://192.168.0.13:8000/admin/case/case/?services__id__in=2,4, пытаюсь удалить Веб-разработку и получаюhttp://192.168.0.13:8000/admin/case/case/?services__id__in=2,4,2
def choices(self, cl):
        """
        заполняем селект нужными данными
        """
        services = Service.objects.all()
        for service in services:
            filter = cl.get_filters_params()
            filter_str, filter_int = [], []
            selected = False
            if filter:
                filter = filter.get(self.parameter_name, "").split(",")
                filter_int = [int(item) for item in filter]
                filter_str = [item for item in filter]
                selected = service.id in filter_int

            yield {
                "selected": selected,
                "query_string": unquote(cl.get_query_string({
                    self.parameter_name: ",".join(filter_str
                                                  + [str(service.id)])
                })),
                "display": service.title
            }



среда, 21 ноября 2018 г., 15:48:46 UTC+4 пользователь PooH написал:
Reply all
Reply to author
Forward
0 new messages