Найти - Пользователи
Полная версия: Как правильно зарегистрировать свой FilterSpec для вычисляемого поля
Начало » Django » Как правильно зарегистрировать свой FilterSpec для вычисляемого поля
1
timas
Здравствуйте.
Возникла проблема с написанием своего фильтра для вычисляемого поля:

есть модель 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))
Но ошибка остается той же самой. Код находится в admin.py этого приложения перед самим использованием фильтра:
class ShedulePeriodAdmin(admin.ModelAdmin):
...
list_display = ('office', 'begin_period', 'end_period', 'expired' )
...

admin.site.register(ShedulePeriod, ShedulePeriodAdmin)
Люди, подскажите пожалуйста как правильно регистрировать свой FilterSpec, чтобы django его хотя бы видела.
p.s. в документации django нет ничего по запросу FilterSpec, а в других примерах (я испозьзовал этот: пример с http://softwaremaniacs.org/) вроде бы все так как я делаю.
freemon
Можно код модели, ошибка явно указывает на то, что поля ‘expired’ нет в модели…
timas
freemon
Можно код модели, ошибка явно указывает на то, что поля ‘expired’ нет в модели…
class ShedulePeriod(models.Model):
"""Период для расписания"""
office = models.ForeignKey(Office, verbose_name = "офис", db_index = True)
begin_period = models.DateField("начало периода", db_index = True)
end_period = models.DateField("конец периода", db_index = True)

@property
def expired(self):
"""Истек или нет период действия"""
#return self.end_period < datetime.date.today()
if self.end_period < datetime.date.today():
return "Истек"
else:
return "Действует"



def __unicode__(self):
return ''.join([ unicode(self.office), ', ', unicode(self.begin_period), ' - ', unicode(self.end_period), ])

class Meta:
ordering = ['begin_period', 'end_period']
verbose_name = "период расписаний работы"
verbose_name_plural = "периоды расписаний работы"
freemon
По-пробуй так:
FilterSpec.register(lambda f: (hasattr(f, 'expired') and bool(f.expired) or isinstance(f, models.related.ShedulePeriod)), ExpiredFilterSpec)
freemon
Подсмотрел здесь ->
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB