Django admin: Фильтр поля по диапазону

Здравствуйте, у меня есть модель под названием Person. Person имеет такие поля как имя/фамилия и возраст. Теперь я хочу сделать фильтр в django admin, который может фильтровать возраст в некоторых пользовательских диапазонах, например 10-15

После прочтения некоторых постов мой лучший снимок -

class RangeFilter(SimpleListFilter):
    title = 'Age filter'
    parameter_name = 'age'
    
    def lookups(self, request, model_admin):
        
        return [
            (1, '0-5'),
            (2, '5-10'),
            (3, '10-15'),
            (4, '15-20')]

    def queryset(self, request, queryset):
        filt_age = request.GET.get('age')
        return queryset.filter(
                    age__range=self.age_dict[filt_age]
                )

но это приводит к ошибке Объект 'RangeFilter' не имеет атрибута 'age_dict'

вероятно, вы имеете в виду:

def lookups(self, request, model_admin):    
    return ('1', '0-5'),('2', '5-10'), ('3', '10-15'), ('4', '15-20')

def queryset(self, request, queryset):
    filt_age = request.GET.get('age')
    age_dict = dict(self.lookups(None, None))
    if age_dict.get(filt_age):
        return queryset.filter(age__range=age_dict[filt_age])
    return queryset

return queryset.filter(age__range=dict(self.lookups(None, None))[filt_age])

Трудновато догадаться, что вы пытаетесь сделать, моя попытка была бы такой:

class RangeFilter(SimpleListFilter):
    title = 'Age filter'
    parameter_name = 'age'

    age_dict = {
        1: (0, 5),
        2: (5, 10),
        3: (10, 15),
        4: (15, 20)
    }

    def lookups(self, request, model_admin):
        return [(k, '-'.join(map(str, v))) for k, v in self.age_dict.items()]

    def queryset(self, request, queryset):
        filt_age = request.GET.get('age')
        return queryset.filter(
            age__range=self.age_dict[filt_age]
        )

Я не знаю, что вы пытаетесь сделать, но я привожу пример ниже для фильтрации людей по возрасту, следуя документации :

# "store/models.py"

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    age =  models.IntegerField()
    
    def __str__(self):
        return self.name
# "store/admin.py"

from django.contrib import admin
from .models import Person

class PersonAgeFilter(admin.SimpleListFilter):
    title = 'Person Age Filter'
    parameter_name = 'age'

    def lookups(self, request, model_admin):
        return (
            ("0-19", '0-19 years'),
            ("20-39", '20-39 years'),
            ("40-59", '40-59 years'),
            ("60<=", '60 years and over'),
        )

    def queryset(self, request, queryset):
        if self.value() == '0-19':
            return queryset.filter(age__lte=19)
        if self.value() == '20-39':
            return queryset.filter(age__range=(20, 39))
        if self.value() == '40-59':
            return queryset.filter(age__range=(40, 59))
        if self.value() == '60<=':
            return queryset.filter(age__gte=60)

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    list_filter = (PersonAgeFilter,)

Затем появляется раздел фильтрации, в котором находятся 5 человек, как показано ниже:

enter image description here

Затем, при нажатии на 20-39 year, 5 человек отфильтровываются до 3 человек, как показано ниже:

enter image description here

Вернуться на верх