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

View file

@ -508,20 +508,39 @@ class AddressFilter(FilterSet):
fields = ["uuid", "user_uuid", "user_email", "order_by"] fields = ["uuid", "user_uuid", "user_email", "order_by"]
class AutocompleteListFilter(SimpleListFilter): class BaseAutocompleteFilter(SimpleListFilter):
title = ""
parameter_name = ""
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
return () return ()
def choices(self, changelist): def choices(self, changelist):
url = reverse(f"admin:{changelist.opts.app_label}_{self.parameter_name}_autocomplete") url = reverse(
val = changelist.get_query_string(remove=[self.parameter_name]) f"admin:{changelist.opts.app_label}_{self.parameter_name}_autocomplete"
current = changelist.params.get(self.parameter_name, "") )
qs = changelist.get_query_string(remove=[self.parameter_name])
val = changelist.params.get(self.parameter_name, "")
html = ( html = (
f'<input type="hidden" class="django-autocomplete admin-autocomplete-filter" ' 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 # 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")