Возникла проблема с написанием своего фильтра для вычисляемого поля:
есть модель ShedulePeriod в которой есть поле:
@property
def expired(self):
"""Истек или нет период действия"""
#return self.end_period < datetime.date.today()
if self.end_period < datetime.date.today():
return "Истек"
else:
return "Действует"
ImproperlyConfigured at /admin/agency/sheduleperiod/
'ShedulePeriodAdmin.list_filter' refers to field ‘expired’ that is missing from model ‘ShedulePeriod’
все решения указывают на то чтобы писать свой фильтр унаследованный от одного из FilterSpec. Вроде бы написал более менее корректно:
from django.contrib.admin.filterspecs import BooleanFieldFilterSpec, FilterSpec
from datetime import datetime
class ExpiredFilterSpec(BooleanFieldFilterSpec):
def title(self):
return "Актуальность"
def choices(self, cl):
choices = super(ExpiredFilterSpec, self).choices(cl)
yield choices.next() # специальное значение "Все" оставляем без изменений
while True:
choice = choices.next()
choice['display'] = self.end_period < datetime.date.today()
yield choice
FilterSpec.filter_specs.insert(0, (lambda f: f.name == 'expired', ExpiredFilterSpec))
class ShedulePeriodAdmin(admin.ModelAdmin):
...
list_display = ('office', 'begin_period', 'end_period', 'expired' )
...
admin.site.register(ShedulePeriod, ShedulePeriodAdmin)
p.s. в документации django нет ничего по запросу FilterSpec, а в других примерах (я испозьзовал этот: пример с http://softwaremaniacs.org/) вроде бы все так как я делаю.