Skip to content

Instantly share code, notes, and snippets.

@hakib
Created December 9, 2017 08:37
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save hakib/1491a848e71078dae81fca48c46cc258 to your computer and use it in GitHub Desktop.
Save hakib/1491a848e71078dae81fca48c46cc258 to your computer and use it in GitHub Desktop.
Django Admin InputFilter
# common/admin.py
class InputFilter(admin.SimpleListFilter):
template = 'admin/input_filter.html'
def lookups(self, request, model_admin):
# Dummy, required to show the filter.
return ((),)
def choices(self, changelist):
# Grab only the "all" option.
all_choice = next(super().choices(changelist))
all_choice['query_parts'] = (
(k, v)
for k, v in changelist.get_filters_params().items()
if k != self.parameter_name
)
yield all_choice
# common/templates/admin/input_filter.html
{% load i18n %}
<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3>
<ul>
<li>
{% with choices.0 as all_choice %}
<form method="GET" action="">
{% for k, v in all_choice.query_parts %}
<input type="hidden" name="{{ k }}" value="{{ v }}" />
{% endfor %}
<input type="text"
value="{{ spec.value|default_if_none:'' }}"
name="{{ spec.parameter_name }}"/>
{% if not all_choice.selected %}
<strong><a href="{{ all_choice.query_string }}">x {% trans 'Remove' %}</a></strong>
{% endif %}
</form>
{% endwith %}
</li>
</ul>
@dtatarkin
Copy link

dtatarkin commented Apr 25, 2024

In Django 5 admin filters now handle multi-valued query parameters.

Django 5 compatible version:

class InputFilter(SimpleListFilter):
    template = 'admin/input_filter.html'

    def lookups(self, request, model_admin):
        # Dummy, required to show the filter.
        return ((),)

    def choices(self, changelist):
        # Grab only the "all" option.
        all_choice = next(super().choices(changelist))
        all_choice['query_parts'] = (
            (k, v)
            for k, values in changelist.get_filters_params().items()
            for v in values
            if k != self.parameter_name
        )
        yield all_choice

@hakib
Copy link
Author

hakib commented May 2, 2024

This will only have any effect if the user edited the URL, right?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment