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
--
Вы получили это сообщение, поскольку подписаны на группу "Django russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес django-russia...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Не понимаю в чем у вас затруднение. Вы правильно унаследовались. Переопределили шаблон. Ну и выводите теперь в нем свой select. Придется только его в форму обернуть с method get и кнопку добавить для отправки или скрипт, чтобы автоматом отправлять на клике по опции. Еще придется переопределить метод def choices(self, changelist) и вылавливать из строки параметров все значения
{% 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>
--
--
хотел скинуть проект, а сообщение удалили
сделал, что бы можно было выбирать несколько вариантов, но теперь не отрабатывает событие, которые было на изменение селекта, ну и не мудрено, теперь нужно добавить кнопку, как её добавить не знаю, пытаюсь в этом же шаблон добавить её, на выходе полный игнор, не появляется на страничке.
Привет всем, возникла необходимость сделать фильтры в админке с множественной фильтрацией. В admin.py добавил класс для переопределения фильтра, но никак не могу разобраться как добавить тег select атрибут multiple
{% 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>
jQuery('.js-example-basic-multiple').on('change.select2'
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 }