Вы можете использовать ModelAdmin
и переопределить метод get_search_results
, например:
# your_app/admin.py
from django.contrib import admin
from .models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ('title', 'amount', 'price')
search_fields = ('title', 'price') # this will create a text input for filtering title and price
def get_search_results(self, request, queryset, search_term):
queryset, use_distinct = super().get_search_results(request, queryset, search_term)
# You need to define a character for splitting your range, in this example I'll use a hyphen (-)
try:
# This will get me the range values if there's only 1 hyphen
min_price, max_price = search_term.split('-')
except ValueError:
# Otherwise it will do nothing
pass
else:
# If the try was successful, it will proceed to do the range filtering
queryset |= self.model.objects.filter(price__gte=min_price, price__lte=max_price)
return queryset, use_distinct
Теперь, если я введу строку '20-25'
, он будет искать заголовок или цену, равную '20-25'
, затем ищите цену в диапазоне от 20 до 25. Если я введу строку '25'
, она будет искать цену или заголовок, равный '25'
, и передаст наш пользовательский фильтр.
Вы можете найти большеоб этом здесь это в документах.