Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Как правильно зарегистрировать свой FilterSpec для вычисляемого поля [RSS Feed]

#1 Март 1, 2011 12:55:35

timas
От:
Зарегистрирован: 2008-08-28
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно зарегистрировать свой FilterSpec для вычисляемого поля

Здравствуйте.
Возникла проблема с написанием своего фильтра для вычисляемого поля:

есть модель 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/) вроде бы все так как я делаю.



Офлайн

#2 Март 9, 2011 16:44:26

freemon
От:
Зарегистрирован: 2008-07-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно зарегистрировать свой FilterSpec для вычисляемого поля

Можно код модели, ошибка явно указывает на то, что поля ‘expired’ нет в модели…



Офлайн

#3 Март 29, 2011 14:14:25

timas
От:
Зарегистрирован: 2008-08-28
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно зарегистрировать свой FilterSpec для вычисляемого поля

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 = "периоды расписаний работы"



Отредактировано (Март 29, 2011 14:15:10)

Офлайн

#4 Март 29, 2011 14:47:19

freemon
От:
Зарегистрирован: 2008-07-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно зарегистрировать свой FilterSpec для вычисляемого поля

По-пробуй так:

FilterSpec.register(lambda f: (hasattr(f, 'expired') and bool(f.expired) or isinstance(f, models.related.ShedulePeriod)), ExpiredFilterSpec)



Отредактировано (Март 29, 2011 14:49:23)

Офлайн

#5 Март 29, 2011 14:51:03

freemon
От:
Зарегистрирован: 2008-07-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно зарегистрировать свой FilterSpec для вычисляемого поля

Подсмотрел здесь ->



Офлайн

  • Начало
  • » Django
  • » Как правильно зарегистрировать свой FilterSpec для вычисляемого поля[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version