Skip to content

Commit d769c0c

Browse files
committed
use select2 make admin filter searchable
1 parent 37aa4ad commit d769c0c

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

adminlteui/admin.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,31 @@ def get_image_box():
4848
option_name='site_logo') else ''
4949

5050

51+
class ModelAdmin(admin.ModelAdmin):
52+
select2_list_filter = ()
53+
54+
class Media:
55+
css = {
56+
"all": ("admin/components/select2/dist/css/select2.min.css",)
57+
}
58+
js = (
59+
"admin/components/select2/dist/js/select2.min.js",
60+
)
61+
62+
def changelist_view(self, request, extra_context=None):
63+
view = super().changelist_view(request, extra_context)
64+
cl = view.context_data.get('cl')
65+
filter_specs = cl.filter_specs
66+
67+
for index, filter_spec in enumerate(filter_specs):
68+
if filter_spec.field_path in self.select2_list_filter:
69+
# flag to use select2
70+
filter_spec.display_select2 = True
71+
cl.filter_specs[index] = filter_spec
72+
view.context_data['cl'] = cl
73+
return view
74+
75+
5176
class GeneralOptionForm(forms.Form):
5277
site_title = forms.CharField(label=_('Site Title'),
5378
widget=widgets.AdminTextInputWidget(),
Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,29 @@
11
{% load i18n %}
22

33
<div class="form-group" style="margin-bottom: 5px;">
4-
<select class="form-control select2 select2-hidden-accessible search-filter" style="width: 100%;" tabindex="-1" aria-hidden="true" data-name="{{ field_name }}">
4+
<select id="id_filter_{{ field_name }}" class="form-control search-filter" style="width: 100%;" tabindex="-1" aria-hidden="true">
55
<option value="">{{ title }}</option>
66
<option value="">---------</option>
77
{% for choice in choices %}
8-
{% if choice.name %}
9-
<option data-name="{{ choice.name }}" value="{{ choice.value }}" {% if choice.selected %} selected {% endif %}>
10-
{{ choice.display }}
11-
</option>
12-
{% endif %}
8+
{% if choice.name %}
9+
<option data-name="{{ choice.name }}" value="{{ choice.value }}" {% if choice.selected %} selected {% endif %}>
10+
{{ choice.display }}
11+
</option>
12+
{% endif %}
1313
{% endfor %}
1414
</select>
15+
{% if spec.display_select2 %}
16+
<script>
17+
django.jQuery('#id_filter_{{ field_name }}').select2({
18+
width: django.jQuery('#id_filter_{{ field_name }}').width() + 26
19+
})
20+
django.jQuery('#id_filter_{{ field_name }}').on('select2:select', function (e) {
21+
if (e.params.data.id !=='') {
22+
django.jQuery('#id_filter_{{ field_name }}').attr('name', e.params.data.element.dataset.name)
23+
} else {
24+
django.jQuery('#id_filter_{{ field_name }}').removeAttr('name')
25+
}
26+
});
27+
</script>
28+
{% endif %}
1529
</div>

0 commit comments

Comments
 (0)