Features: 1) Add BaseAutocompleteFilter and specialized filters (BrandAdminFilter, CategoryAdminFilter, TagsAdminFilter, VendorAdminFilter) for admin filtering;

Fixes: 1) Replace hardcoded `AutocompleteListFilter` with newly created filters for better modularity;

Extra: 1) Refactor queryset string handling and enhance readability in filter choices; 2) Update admin `list_filter` with new filter classes.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-07-01 15:20:46 +03:00
parent 76c700c3a0
commit c3d5160e61
2 changed files with 33 additions and 14 deletions

View file

@ -13,7 +13,7 @@ from mptt.admin import DraggableMPTTAdmin
from evibes.settings import CONSTANCE_CONFIG
from .filters import AutocompleteListFilter
from .filters import BrandAdminFilter, CategoryAdminFilter, TagsAdminFilter, VendorAdminFilter
from .forms import OrderForm, OrderProductForm, VendorForm
from .models import (
Address,
@ -251,10 +251,10 @@ class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, AutocompleteFilterMix
list_filter = (
"is_active",
"is_digital",
("brand", AutocompleteListFilter),
("category", AutocompleteListFilter),
("tags", AutocompleteListFilter),
("stocks__vendor", AutocompleteListFilter),
BrandAdminFilter,
CategoryAdminFilter,
TagsAdminFilter,
VendorAdminFilter,
"created",
"modified",
)

View file

@ -508,20 +508,39 @@ class AddressFilter(FilterSet):
fields = ["uuid", "user_uuid", "user_email", "order_by"]
class AutocompleteListFilter(SimpleListFilter):
title = ""
parameter_name = ""
class BaseAutocompleteFilter(SimpleListFilter):
def lookups(self, request, model_admin):
return ()
def choices(self, changelist):
url = reverse(f"admin:{changelist.opts.app_label}_{self.parameter_name}_autocomplete")
val = changelist.get_query_string(remove=[self.parameter_name])
current = changelist.params.get(self.parameter_name, "")
url = reverse(
f"admin:{changelist.opts.app_label}_{self.parameter_name}_autocomplete"
)
qs = changelist.get_query_string(remove=[self.parameter_name])
val = changelist.params.get(self.parameter_name, "")
html = (
f'<input type="hidden" class="django-autocomplete admin-autocomplete-filter" '
f'data-autocomplete-url="{url}" name="{self.parameter_name}" value="{current}"/>'
f'data-autocomplete-url="{url}" name="{self.parameter_name}" value="{val}"/>'
)
# noinspection DjangoSafeString
yield {"query_string": val, "display": mark_safe(html)}
yield {"query_string": qs, "display": mark_safe(html)}
class BrandAdminFilter(BaseAutocompleteFilter):
title = _("By Brand")
parameter_name = _("brand")
class CategoryAdminFilter(BaseAutocompleteFilter):
title = _("By Category")
parameter_name = _("category")
class TagsAdminFilter(BaseAutocompleteFilter):
title = _("By Product tags")
parameter_name = _("tags")
class VendorAdminFilter(BaseAutocompleteFilter):
title = _("By Associated vendor")
parameter_name = _("stocks__vendor")