با توجه به کدهای زیر میتونی برای پنل ادمین فیلترهای بیشتری بسازی؟
تقریبا برای هرچی که قابلیت فیلتر داره فیلتر بساز

from django.contrib import admin
from .models import EstateUse, EstateType, EstateSaleInfo, EstateRentInfo
from .forms import EstateSaleInfoForm, EstateRentInfoForm
from django.utils.translation import gettext_lazy as _


class BaseAdmin(admin.ModelAdmin):
    list_display = ('name',)
    search_fields = ('name',)

@admin.register(EstateUse)
class estateUseAdmin(BaseAdmin):
    list_display = ('name',)
    search_fields = ('name',)

@admin.register(EstateType)
class estateTypeAdmin(BaseAdmin):
    list_display = ('name',)
    search_fields = ('name',)


class SellPriceFilter(admin.SimpleListFilter):
    title = _('بازه قیمت فروش')
    parameter_name = 'sell_price_range'

    def lookups(self, request, model_admin):
        return (
            ('1', _('0 - 2 میلیارد')),
            ('2', _('2 - 3 میلیارد')),
            ('3', _('3 - 4 میلیارد')),
            ('4', _('بیشتر از 4 میلیارد')),
        )
    def queryset(self, request, queryset):
        if self.value() == '1':
            return queryset.filter(sellـprice__gte=0, sellـprice__lt=2_000_000_000)
        elif self.value() == '2':
            return queryset.filter(sellـprice__gte=2_000_000_000, sellـprice__lt=3_000_000_000)
        elif self.value() == '3':
            return queryset.filter(sellـprice__gte=3_000_000_000, sellـprice__lt=4_000_000_000)
        elif self.value() == '4':
            return queryset.filter(sellـprice__gte=4_000_000_000)
        return queryset
class MortgagePriceFilter(admin.SimpleListFilter):
    title = _('بازه قیمت رهن')
    parameter_name = 'mortgage_price_range'

    def lookups(self, request, model_admin):
        return (
            ('1', _('0 - 100 میلیون')),
            ('2', _('200 - 300 میلیون')),
            ('3', _('300 - 400 میلیون')),
            ('4', _('بیشتر از 400 میلیون')),
        )
    def queryset(self, request, queryset):
        if self.value() == '1':
            return queryset.filter(sellـprice__gte=0, sellـprice__lt=200_000_000)
        elif self.value() == '2':
            return queryset.filter(sellـprice__gte=200_000_000, sellـprice__lt=300_000_000)
        elif self.value() == '3':
            return queryset.filter(sellـprice__gte=300_000_000, sellـprice__lt=400_000_000)
        elif self.value() == '4':
            return queryset.filter(sellـprice__gte=400_000_000)
        return queryset
class RentPriceFilter(admin.SimpleListFilter):
    title = _('بازه قیمت اجاره')
    parameter_name = 'rent_price_range'

    def lookups(self, request, model_admin):
        return (
            ('1', _('0 - 5 میلیون')),
            ('2', _('5 - 10 میلیون')),
            ('3', _('10 - 20 میلیون')),
            ('4', _('بیشتر از 20 میلیون')),
        )
    def queryset(self, request, queryset):
        if self.value() == '1':
            return queryset.filter(sellـprice__gte=0, sellـprice__lt=5_000_000)
        elif self.value() == '2':
            return queryset.filter(sellـprice__gte=5_000_000, sellـprice__lt=10_000_000)
        elif self.value() == '3':
            return queryset.filter(sellـprice__gte=10_000_000, sellـprice__lt=20_000_000)
        elif self.value() == '4':
            return queryset.filter(sellـprice__gte=20_000_000)
        return queryset

@admin.register(EstateSaleInfo)
class EstateSaleInfoAdmin(admin.ModelAdmin):
    form = EstateSaleInfoForm
    change_form_template = 'admin/app_estate/EstateSaleInfo/change_form.html'
    list_display = (
        'estate_use', 'estate_type', 
        'get_consultant_full_name', 'get_customer_full_name',
    )
    search_fields = (
        'consultant__first_name', 'consultant__last_name', 
        'customer__first_name', 'customer__last_name',
        'estate_use', 'estate_type',
    )
    list_filter = (SellPriceFilter,)
    autocomplete_fields = ('consultant', 'customer')

    fieldsets = (
        ('اطلاعات مشاور و مشتری', {'fields': ('consultant', 'customer')}),
        ('اطلاعات عمومی ملک', {'fields': ('estate_use', 'estate_type', 'ownership_document_type', 'year_manufacture', 
                                            'floor_number', 'units_per_floor', 'number_room', 
                                            'estate_location', 'estate_address')}),
        ('اطلاعات قیمتی ملک', {'fields': ('sellـprice',)}),
        ('اطلاعات متراژ ملک', {'fields': ('useful_size', 'is_parking', 'parking_size',
                                             'is_warehouse', 'warehouse_size', 'is_balcony', 
                                             'balcony_size', 'is_courtyard', 'courtyard_size')}),
        ('اطلاعات امکانات رفاهی', {'fields': ('is_elevator', 'cooling_system', 
                                                 'heating_system', 'cabinet', 'floor_material', 
                                                 'more_info')}),
    )

    def get_extra_context(self, request):
        return {
            'estate_use_list': list(EstateUse.objects.values_list('name', flat=True)),
            'estate_type_list': list(EstateType.objects.values_list('name', flat=True)),
        }

    def add_view(self, request, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context.update(self.get_extra_context(request))
        return super().add_view(request, form_url, extra_context=extra_context)

    def change_view(self, request, object_id, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context.update(self.get_extra_context(request))
        return super().change_view(request, object_id, form_url, extra_context=extra_context)

    def get_consultant_full_name(self, obj):
        return f"{obj.consultant.first_name} {obj.consultant.last_name}"
    get_consultant_full_name.short_description = 'نام مشاور'

    def get_customer_full_name(self, obj):
        return f"{obj.customer.first_name} {obj.customer.last_name}"
    get_customer_full_name.short_description = 'نام مشتری'

@admin.register(EstateRentInfo)
class EstateRentInfoAdmin(admin.ModelAdmin):
    form = EstateRentInfoForm
    change_form_template = 'admin/app_estate/EstateRentInfo/change_form.html'
    list_display = (
        'estate_use', 'estate_type', 
        'get_consultant_full_name', 'get_customer_full_name',
    )
    search_fields = (
        'consultant__first_name', 'consultant__last_name', 
        'customer__first_name', 'customer__last_name',
        'estate_use', 'estate_type',
    )
    list_filter = (MortgagePriceFilter, RentPriceFilter)
    autocomplete_fields = ('consultant', 'customer')

    fieldsets = (
        ('اطلاعات مشاور و مشتری', {'fields': ('consultant', 'customer')}),
        ('اطلاعات عمومی ملک', {'fields': ('estate_use', 'estate_type', 'year_manufacture', 
                                            'floor_number', 'units_per_floor', 'number_room', 
                                            'estate_location', 'estate_address')}),
        ('اطلاعات قیمتی ملک', {'fields': ('mortgage_price', 'rent_price')}),
        ('اطلاعات متراژ ملک', {'fields': ('useful_size', 'is_parking', 'parking_size',
                                             'is_warehouse', 'warehouse_size', 'is_balcony', 
                                             'balcony_size', 'is_courtyard', 'courtyard_size')}),
        ('اطلاعات امکانات رفاهی', {'fields': ('is_elevator', 'cooling_system', 
                                                 'heating_system', 'cabinet', 'floor_material', 
                                                 'more_info')}),
    )

    def get_extra_context(self, request):
        return {
            'estate_use_list': list(EstateUse.objects.values_list('name', flat=True)),
            'estate_type_list': list(EstateType.objects.values_list('name', flat=True)),
        }

    def add_view(self, request, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context.update(self.get_extra_context(request))
        return super().add_view(request, form_url, extra_context=extra_context)

    def change_view(self, request, object_id, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context.update(self.get_extra_context(request))
        return super().change_view(request, object_id, form_url, extra_context=extra_context)

    def get_consultant_full_name(self, obj):
        return f"{obj.consultant.first_name} {obj.consultant.last_name}"
    get_consultant_full_name.short_description = 'نام مشاور'

    def get_customer_full_name(self, obj):
        return f"{obj.customer.first_name} {obj.customer.last_name}"
    get_customer_full_name.short_description = 'نام مشتری'


from django.db import models
from app_account.models import CustomUser
from django.core.validators import MinValueValidator



class EstateUse(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="نوع کاربری"
    )
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'tbl_estate_use'
        verbose_name = 'کاربری ملک'
        verbose_name_plural = 'جدول انواع کاربری'


class EstateType(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="نوع ملک"
    )
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'tbl_estate_type'
        verbose_name = 'نوع ملک'
        verbose_name_plural = 'جدول انواع ملک'

class EstateSaleInfo(models.Model):
    consultant = models.ForeignKey(
        CustomUser,
        on_delete=models.DO_NOTHING,
        blank=True, 
        null=True, 
        verbose_name='مشاور',
        related_name='consultant_estatesaleinfo_set',  
        limit_choices_to=models.Q(is_staff=True) | models.Q(is_superuser=True) 
    )
    customer = models.ForeignKey(
        CustomUser,
        on_delete=models.DO_NOTHING,
        blank=True, 
        null=True,
        verbose_name='مشتری',
        related_name='customer_estatesaleinfo_set', 
        limit_choices_to=~models.Q(is_staff=True) 
    )
    estate_use = models.CharField(
        max_length=20, 
        blank=True,  
        verbose_name='کاربری ملک'
    )
    estate_type = models.CharField(
        max_length=20, 
        blank=True, 
        verbose_name='نوع ملک'
    )
    sellـprice = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='قیمت فروش'
    )
    year_manufacture = models.IntegerField(
        default=1300,
        blank=True,  
        validators=[MinValueValidator(1300)],
        verbose_name='سال ساخت'
    )
    floor_number = models.IntegerField(
        default=0,
        blank=True, 
        validators=[MinValueValidator(0)],
        verbose_name='شماره طبقه'
    )
    units_per_floor = models.IntegerField(
        default=1,
        blank=True, 
        validators=[MinValueValidator(1)],
        verbose_name='تعداد واحد در طبقه'
    )
    class OwnershipTypeChoices(models.TextChoices):
        SingleSheetDocument = 'single_sheet_document', "سند تک برگی"
        BookletDocument = 'booklet_document' , "سند دغترچه ای"
        WrittePromise = 'written_promise', "قولنامه"
    ownership_document_type = models.CharField(
        max_length=30,
        blank=True, 
        choices= OwnershipTypeChoices.choices,
        verbose_name='نوع سند مالکیت'
    )
    class EstateLocationChoices(models.TextChoices):
        Northern = 'Northern', "شمالی"
        South = 'South' , "جنوبی"
        NorthernSouth = 'northern_south', "شمالی - جنوبی"
    estate_location = models.CharField(
        max_length=30,
        blank=True, 
        choices= EstateLocationChoices.choices,
        verbose_name='موقعیت ملک'
    )
    estate_address = models.TextField(
        blank=True, 
        verbose_name='آدرس ملک'
    )
    number_room = models.IntegerField(
        default=1,
        blank=True, 
        validators=[MinValueValidator(0)],
        verbose_name='تعداد اتاق'
    )
    useful_size = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='متراژ مفید'
    )
    is_parking = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='پارکینگ دارد'
    )
    parking_size = models.FloatField( 
        default= 0.0,
        blank=True, 
        verbose_name='متراژ پارکینگ'
    )
    is_warehouse = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='انباری دارد'
    )
    warehouse_size = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='متراژ انباری'
    )
    is_balcony = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='بالکن دارد'
    )
    balcony_size = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='متراژ بالکن'
    )
    is_courtyard = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='حیاط دارد'
    )
    courtyard_size = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='متراژ حیاط'
    )
    class CoolingSystemChoices(models.TextChoices):
        WaterCooler = 'water_cooler' , "کولر آبی"
        AirConditioner = 'air_conditioner', "کولر گازی"
        CentralCooling = 'central_cooling', "سرمایش مرکزی"
        CeilingFan = 'ceiling_fan', "پنکه سقفی"
    cooling_system = models.CharField(
        max_length=30,
        blank=True, 
        choices= CoolingSystemChoices.choices,
        verbose_name='سیستم سرمایشی'
    )
    class HeatingSystemChoices(models.TextChoices):
        RadiatorPackage = 'radiator_package', "پکیج رادیاتور"
        HeatedFloorPackage = 'heated_floor_package' , "پکیج کف گرمایش"
        GasHeater = 'gas_heater', "بخاری گازی"
        CentralHeateding = 'central_heateding', "گرمایش مرکزی"
    heating_system = models.CharField(
        max_length=30,
        blank=True, 
        choices= HeatingSystemChoices.choices,
        verbose_name='سیستم گرمایشی'
    )
    class CabinetChoices(models.TextChoices):
        NotAvailable = 'not_available', "ندارد"
        Full = 'full' , "فول"
        Medium = 'medium', "متوسط"
        Poor = 'poor', "ضعیف"
    cabinet = models.CharField(
        max_length=30,
        blank=True, 
        choices= CabinetChoices.choices,
        verbose_name='وضعیت کابینت و کمد'
    )
    class FloorMaterialChoices(models.TextChoices):
        Ceramics = 'cramics', "سرامیک"
        Chalk = 'chalk' , "کچ"
        Asphalt = 'asphalt', "آسفالت"
        Tile = 'tile', "کاشی"
        Stone = 'stone', "سنگ"
        Clay = 'clay', "خاکی"
    floor_material = models.CharField(
        max_length=30,
        blank=True, 
        choices= FloorMaterialChoices.choices,
        verbose_name='جنس کف'
    )
    is_elevator = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='آسانسور دارد'
    )
    more_info = models.TextField(
        blank=True,
        verbose_name='توضیحات تکمیلی'
    )

    def __str__(self) -> str:
        return f"{self.consultant}/{self.customer}"

    class Meta:
        db_table = 'tbl_estate_sale_info'
        verbose_name = 'ملک فروشی'
        verbose_name_plural = 'مدیریت املاک فروشی'

class EstateRentInfo(models.Model):
    consultant = models.ForeignKey(
        CustomUser,
        on_delete=models.DO_NOTHING,
        blank=True, 
        null=True, 
        verbose_name='مشاور',
        related_name='consultant_estaterentinfo_set',  
        limit_choices_to=models.Q(is_staff=True) | models.Q(is_superuser=True) 
    )
    customer = models.ForeignKey(
        CustomUser,
        on_delete=models.DO_NOTHING,
        blank=True, 
        null=True,
        verbose_name='مشتری',
        related_name='customer_estaterentinfo_set', 
        limit_choices_to=~models.Q(is_staff=True) 
    )
    estate_use = models.CharField(
        max_length=20, 
        blank=True,  
        verbose_name='کاربری ملک'
    )
    estate_type = models.CharField(
        max_length=20, 
        blank=True, 
        verbose_name='نوع ملک'
    )
    mortgage_price = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='قیمت رهن'
    )
    rent_price = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='قیمت اجاره'
    )
    year_manufacture = models.IntegerField(
        default=1300,
        blank=True,  
        validators=[MinValueValidator(1300)],
        verbose_name='سال ساخت'
    )
    floor_number = models.IntegerField(
        default=0,
        blank=True, 
        validators=[MinValueValidator(0)],
        verbose_name='شماره طبقه'
    )
    units_per_floor = models.IntegerField(
        default=1,
        blank=True, 
        validators=[MinValueValidator(1)],
        verbose_name='تعداد واحد در طبقه'
    )
    class EstateLocationChoices(models.TextChoices):
        Northern = 'Northern', "شمالی"
        South = 'South' , "جنوبی"
        NorthernSouth = 'northern_south', "شمالی - جنوبی"
    estate_location = models.CharField(
        max_length=30,
        blank=True, 
        choices= EstateLocationChoices.choices,
        verbose_name='موقعیت ملک'
    )
    estate_address = models.TextField(
        blank=True, 
        verbose_name='آدرس ملک'
    )
    number_room = models.IntegerField(
        default=1,
        blank=True, 
        validators=[MinValueValidator(0)],
        verbose_name='تعداد اتاق'
    )
    useful_size = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='متراژ مفید'
    )
    is_parking = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='پارکینگ دارد'
    )
    parking_size = models.FloatField( 
        default= 0.0,
        blank=True, 
        verbose_name='متراژ پارکینگ'
    )
    is_warehouse = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='انباری دارد'
    )
    warehouse_size = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='متراژ انباری'
    )
    is_balcony = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='بالکن دارد'
    )
    balcony_size = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='متراژ بالکن'
    )
    is_courtyard = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='حیاط دارد'
    )
    courtyard_size = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='متراژ حیاط'
    )
    class CoolingSystemChoices(models.TextChoices):
        WaterCooler = 'water_cooler' , "کولر آبی"
        AirConditioner = 'air_conditioner', "کولر گازی"
        CentralCooling = 'central_cooling', "سرمایش مرکزی"
        CeilingFan = 'ceiling_fan', "پنکه سقفی"
    cooling_system = models.CharField(
        max_length=30,
        blank=True, 
        choices= CoolingSystemChoices.choices,
        verbose_name='سیستم سرمایشی'
    )
    class HeatingSystemChoices(models.TextChoices):
        RadiatorPackage = 'radiator_package', "پکیج رادیاتور"
        HeatedFloorPackage = 'heated_floor_package' , "پکیج کف گرمایش"
        GasHeater = 'gas_heater', "بخاری گازی"
        CentralHeateding = 'central_heateding', "گرمایش مرکزی"
    heating_system = models.CharField(
        max_length=30,
        blank=True, 
        choices= HeatingSystemChoices.choices,
        verbose_name='سیستم گرمایشی'
    )
    class CabinetChoices(models.TextChoices):
        NotAvailable = 'not_available', "ندارد"
        Full = 'full' , "فول"
        Medium = 'medium', "متوسط"
        Poor = 'poor', "ضعیف"
    cabinet = models.CharField(
        max_length=30,
        blank=True, 
        choices= CabinetChoices.choices,
        verbose_name='وضعیت کابینت و کمد'
    )
    class FloorMaterialChoices(models.TextChoices):
        Ceramics = 'cramics', "سرامیک"
        Chalk = 'chalk' , "کچ"
        Asphalt = 'asphalt', "آسفالت"
        Tile = 'tile', "کاشی"
        Stone = 'stone', "سنگ"
        Clay = 'clay', "خاکی"
    floor_material = models.CharField(
        max_length=30,
        blank=True, 
        choices= FloorMaterialChoices.choices,
        verbose_name='جنس کف'
    )
    is_elevator = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='آسانسور دارد'
    )
    more_info = models.TextField(
        blank=True,
        verbose_name='توضیحات تکمیلی'
    )

    def __str__(self) -> str:
        return f"{self.consultant}/{self.customer}"

    class Meta:
        db_table = 'tbl_estate_rent_info'
        verbose_name = 'ملک اجاره ای'
        verbose_name_plural = 'مدیریت املاک اجاره ای'