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