过滤InlineFormset中的项目

时间:2009-07-20 07:04:39

标签: django-forms

我目前正在使用inlineformset_factory来获取带有Holidays for Person的formset,但我只想显示将来的Holiday对象。

HolidaysFormset = inlineformset_factory(Person, Holiday)

在Person类中,很容易获得未来的假期:

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

我查看了相关的源代码,并且formfield_callback看起来略显有希望,但这只是基于每个字段调用,并且不能用于(我认为)来限制哪些对象匹配。

有什么建议吗?我最好创建自己的FormSet,还是Holiday的子类?或者我应该考虑使用自定义管理器吗?

2 个答案:

答案 0 :(得分:0)

一种解决方案是提供一个新的FormSet Base类,并覆盖.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,因为这里讨论了这种解决方案。)

答案 1 :(得分: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类,但没有一种方法可行。

虽然这有效,但在我的项目中,简化模型可能是一个更好的解决方案。