2009-07-20 2 views
1

В настоящее время я использую inlineformset_factory для получения набора форм с Holidays для Person, но я хочу отображать объекты Holiday, которые есть в будущем.Фильтрация элементов в InlineFormset

HolidaysFormset = inlineformset_factory(Person, Holiday) 

В классе Person, легко получить будущие праздники:

def future_holidays(self): 
    return self.holidays.filter(end__gte=datetime.date.today()) 

Я просмотрел на соответствующем исходном коде, и formfield_callback выглядел слегка многообещающим, но это только называется по на основе поля и не может использоваться (я думаю), чтобы ограничить, какие объекты совпадают.

Любые предложения? Смогу ли я лучше создать свой собственный FormSet или подкласс Holiday? Или я должен изучать использование пользовательского менеджера?

ответ

0

Одним из решений является предоставление нового базового класса FormSet, с переопределенным методом .get_queryset().

class BaseFutureHolidaysFormSet(BaseInlineFormSet): 
    def get_queryset(self): 
     return BaseInlineFormSet.get_queryset(self).filter(
        finish__gte=datetime.date.today() 
     ) 

Затем используйте это фабричный метод:

HolidaysFormSet = inlineformset_factory(Person, Holiday, 
    formset=BaseFutureHolidaysFormSet) 

Это работает, как задумано.

(О, большое спасибо к The Nested Float, поскольку этот тип решения обсуждается здесь.)

0

Это решение не работает для меня - я только получил странные сообщения об ошибках.

Мое решение в Django 1.1 (в моем приложении, а не в приложении администратора) должно было вернуться к базовой модели FormSet, которая поддерживает ограничение набора запросов: http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#changing-the-queryset.

Например:

MyFormSet = modelformset_factory(MyModel) 

и

myformset = MyFormSet(queryset=MyModel.objects.exclude(..criteria here..).filter(document=object_id)) 

Я также попробовал несколько способов над верхом класса BaseInlineFormset, но никто не работал.

Хотя это работает, в моем проекте упрощение модели может быть лучшим решением.

+0

Какие ошибки? –

Смежные вопросы